Java数据库连接池之proxool_动力节点Java学院整理

Proxool是一种Java数据库连接池技术。sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。

目前是和DBCP以及C3P0一起,最为常见的三种JDBC连接池技术。

日前,Hibernate官方宣布由于Bug太多不再支持DBCP,而推荐使用 Proxool或C3P0。

下面通过一个Demo说明一下如何使用:

项目结构如下:

DBLink.Java文件中的代码:

package com.bjpowernode.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DBLink {
  private Connection connection;
  private PreparedStatement preparedStatement;
  private ResultSet resultSet;
  static{
    try {
      Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); //加载驱动
    }catch (ClassNotFoundException e) {
      System.out.println("加载驱动失败!");
      e.printStackTrace();
    }
  }
  private Connection getConn(){
    try {
      if(connection==null||connection.isClosed()){
        connection = DriverManager.getConnection("proxool.mysqlsource");  //获取连接
      }
    } catch (SQLException e) {
      System.out.println("获取连接失败!");
      e.printStackTrace();
    }
    return connection;
  }
  public List<Map<String, Object>> select(String sql, Object [] params){
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    try{
      connection = this.getConn();
      preparedStatement = connection.prepareStatement(sql);
      if(params != null){
        for(int i =0; i<params.length; i++){
          preparedStatement.setObject(i+1, params[i]);//逐一给问号赋值
        }
      }
      resultSet = preparedStatement.executeQuery();
      ResultSetMetaData rsmd = resultSet.getMetaData();
      int columnCount = rsmd.getColumnCount();
      while(resultSet.next()){
        Map<String, Object> map = new HashMap<String, Object>();
        for(int i =1; i<=columnCount;i++){
          String columnName = rsmd.getColumnName(i);
          Object obj = null;
          if(rsmd.getColumnTypeName(i).equals("DATE")){
            obj = resultSet.getString(columnName);
          }else{
            obj = resultSet.getObject(columnName);
          }
          map.put(columnName, obj);
        }
        list.add(map);
      }
    }catch(SQLException e){
      e.printStackTrace();
    }finally{
      close();
    }
    return list;
  }
  private void close(){
    try {
      if(resultSet != null){
        resultSet.close();
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
    try {
      if(preparedStatement != null){
        preparedStatement.close();
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
    try {
      connection.close();
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
} 

proxool.xml文件中的代码:

<?xml version="1.0" encoding="UTF-8"?>
<proxool-config>
  <proxool>
    <alias>mysqlsource</alias>
    <driver-url>jdbc:mysql://localhost:3306/test</driver-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <driver-properties>
      <property name="user" value="root" />
      <property name="password" value="root" />
    </driver-properties>
    <!-- 保留线程处于睡眠状态的最长时间 -->
    <house-keeping-sleep-time>60000</house-keeping-sleep-time>
    <maximum-connection-count>30</maximum-connection-count>
    <minimum-connection-count>10</minimum-connection-count>
    <!-- 连接池中可用的连接数量(空闲状态) -->
    <prototype-count>5</prototype-count>
    <maximum-new-connections>1</maximum-new-connections>
    <simultaneous-build-throttle>1</simultaneous-build-throttle>
    <!-- 连接池使用状态 -->
    <statistics>30s,10m,1d</statistics>
    <!-- 连接池日志类型 -->
    <statistics-log-level>ERROR</statistics-log-level>
    <!-- 如果为true,那么每个被执行的SQL语句将会在执行期被log记录(DEBUG LEVEL) -->
    <trace>true</trace>
    <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
  </proxool>
</proxool-config> 

web.xml文件中的代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

  <!-- 连接池 -->
  <servlet>
    <servlet-name>ServletConfigurator</servlet-name>
    <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
    <init-param>
      <param-name>xmlFile</param-name>
      <param-value>WEB-INF/proxool.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet> 

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app> 

index.jsp文件中的代码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="com.bjpowernode.util.DBLink,java.util.List,java.util.Map"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>首页</title>
  </head> 

  <body>
    <table width="100%" border="1px">
      <tr>
        <th>序号  </th><th>班级名称</th><th>开班日期</th><th>结束日期</th><th>状态</th><th>操作</th>
      </tr>
      <%
        String sql = "SELECT id, class_name, begin_date, end_date, state FROM class ";
        DBLink db = new DBLink();
        List<Map<String, Object>> list = db.select(sql, null);
        int index = 0;
        for (Map<String, Object> map : list) {
          index = index + 1;
          int id = Integer.parseInt(map.get("id").toString());
          String className = map.get("class_name").toString();
          String beginDate = map.get("begin_date").toString();
          String endDate = map.get("end_date").toString();
          int state = Integer.parseInt(map.get("state").toString());
          String stateName = (state == 0 ? "未启用" : "启用");
      %>
      <tr align="center">
        <td><%=index%></td><td><%=className%></td><td><%=beginDate%></td><td><%=endDate%></td><td><%=stateName%></td><td>【<a href="###" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="">修改</a>】【<a href="###" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="">查看</a>】【<a href="###" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="">删除</a>】</td>
      </tr>
      <%
        }
      %>
    </table>
  </body>
</html> 

总结

以上所述是小编给大家介绍的Java数据库连接池之proxool,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Java实现数据库连接池简易教程

    一.引言 池化技术在Java中应用的很广泛,简而论之,使用对象池存储某个实例数受限制的实例,开发者从对象池中获取实例,使用完之后再换回对象池,从而在一定程度上减少了系统频繁创建对象销毁对象的开销.Java线程池和数据库连接池就是典型的应用,但并非所有的对象都适合拿来池化,对于创建开销比较小的对象拿来池化反而会影响性能,因为维护对象池也需要一定的资源开销,对于创建开销较大,又频繁创建使用的对象,采用池化技术会极大提高性能. 业界有很多成熟的数据库连接池,比如C3P0,DBCP,Proxool以及阿

  • java实现mongodb的数据库连接池

    MongoDB是介于关系数据库和非关系数据库之间的一种产品,文件的存储格式为BSON(一种JSON的扩展),这里就主要介绍Java通过使用mongo-2.7.3.jar包实现mongodb连接池,具体的java代码实现如下: 数据库连接池配置参数: /** *@Description: mongo连接池配置文件 */ package cn.lulei.mongo.pool; public class MongoConfig { private static String userName;//用

  • Java实现数据库连接池的方法

    本文实例讲述了Java实现数据库连接池的方法.分享给大家供大家参考.具体如下: package com.kyo.connection; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import j

  • Spring Boot集成Druid数据库连接池

    1. 前言 Druid数据库连接池由阿里巴巴开源,号称是java语言中最好的数据库连接池,是为监控而生的.Druid的官方地址是:https://github.com/alibaba/druid 通过本文,我们可以看到 Spring Boot 如何配置数据源 Spring Boot 如何集成Druid数据库连接池 如何打开并访问Druid数据库连接池的监控功能 Spring Boot 使用JdbcTemplate操作数据库 2. 配置pom.xml <parent> <groupId&g

  • 数据库连接池c3p0配置_动力节点Java学院整理

    c3p0的配置方式分为三种,分别是 1.setters一个个地设置各个配置项 2.类路径下提供一个c3p0.properties文件 3.类路径下提供一个c3p0-config.xml文件 1.setters一个个地设置各个配置项 这种方式最繁琐,形式一般是这样: Properties props = new Properties(); InputStream in = ConnectionManager.class.getResourceAsStream("/c3p0.properties&q

  • Java数据库连接池之c3p0简介_动力节点Java学院整理

    c3p0是什么 c3p0的出现,是为了大大提高应用程序和数据库之间访问效率的. 它的特性: 编码的简单易用 连接的复用 连接的管理 说到c3p0,不得不说一下jdbc本身,c3p0愿意就是对数据库连接的管理,那么原有的概念还是得清晰:DriverManager.Connection.StateMent.ResultMent. jdbc:java database connective这套API,不用多说,是一套用于连接各式dbms或连接桥接器的api,两个层级:上层供应用方调用api,下层,定义

  • Java中常用的数据库连接池_动力节点Java学院整理

    定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是针对这个问题提出来的. 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏.这项技术能明显提高对数据库操作的性能. 参考资料 DBCP 下载地址:http://

  • Spring 数据库连接池(JDBC)详解

    数据库连接池 对一个简单的数据库应用,由于对数据库的访问不是很频繁,这时可以简单地在需要访问数据库时,就新创建一个连接,就完后就关闭它,这样做也不会带来什么性能上的开销.但是对于一个复杂的数据库应用,情况就完全不同而,频繁的建立.关闭连接,会极大地减低系统的性能,因为对于连接的使用成了系统性能的瓶颈. 通过建立一个数据库连接池以及一套连接使用管理策略,可以达到连接复用的效果,使得一个数据库连接可以得到安全.高效的复用,避免了数据库连接频繁建立.关闭的开销. 数据库连接池的基本原理是在内部对象池中

  • Java数据库连接池之DBCP浅析_动力节点Java学院整理

    一. 为何要使用数据库连接池 假设网站一天有很大的访问量,数据库服务器就需要为每次连接创建一次数据库连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.拓机. 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个. 数据库连接池

  • C3P0连接池+MySQL的配置及wait_timeout问题的解决方法

     一.配置环境 spring4.2.4+mybatis3.2.8+c3p0-0.9.1.2+Mysql5.6.24 二.c3p0的配置详解及spring+c3p0配置 1.配置详解 官方文档 : http://www.mchange.com/projects/c3p0/index.html <c3p0-config> < default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: 3 --> <property

随机推荐