[转自:http://express.ruanko.com/ruanko-express_35/technologyexchange5.html]
Java数据库连接池浅谈
一、连接池原理及介绍:
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:
1、最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
2、最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
3、如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
二、Java中开源的数据库连接池:
1、Proxool 这是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。
2、C3P0 是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
3、Jakarta DBCP 是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用。
在hibernate3.0中,已经不再支持dbcp了,hibernate的作者在hibernate.org中,明确指出在实践中发现dbcp有BUG,在某些种情会产生很多空连接不能释放,所以抛弃了对dbcp的支持。至于c3p0,有评论说它的算法不是最优的,c3p0占用资源比较大,效率也不高。proxool不少行家推荐使用,是负面评价是最少的一个。从性能和出错率来说,proxool稍微比前两种好些。
三、Proxool和C3P0例子(以sqlserver2000数据库为例)
1、Proxool例子
Proxool下载地址:http://sourceforge.net/projects/proxool/files/proxool/,必须加入的包:commons-logging 下载地址:http://commons.apache.org/logging/。
1)Proxool.properties配置:
jdbc-0.proxool.alias=sqlserver jdbc-0.proxool.driver-class=com.microsoft.jdbc.sqlserver. SQLServerDriver jdbc-0.proxool.driver-url=jdbc:microsoft:sqlserver://127.0.0.1:1433; DatabaseName=Northwind jdbc-0.user=sa jdbc-0.password=sa jdbc-0.proxool.maximum-connection-count=20 jdbc-0.proxool.prototype-count=4 jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE jdbc-0.proxool.verbose=true jdbc-0.proxool.statistics=10s,1m,1d jdbc-0.proxool.statistics-log-level=ERROR |
属性说明:
maximum-connection-count: 最大的数据库连数. maximum-connection-lifetime: 连接最大生命时间 默认4小时 minimum-connection-count: 最小的数据库连接数 prototype-count: 连接池中可用的连接数量.如果当前的连接池中的连接少于这个数值. 新的连接将被建立(假设没有超过最大可用数) simultaneous-build-throttle:同时最大连接数 statistics: 连接池使用状况统计。参数“10s,1m,1d” statistics-log-level: 日志统计跟踪类型。 参数“ERROR”或 “INFO” verbose: 详细信息设置。参数 boolean 值 |
2)例子:
public class Test { public static void main(String[] args) { Connection conn=null; try { PropertyConfigurator.configure("Proxool.properties"); conn = DriverManager.getConnection("proxool.sqlserver"); if(conn!=null) System.out.println("数据连接测试成功!"); Statement Stmt=conn.createStatement(); ResultSet Rst=null; Rst=Stmt.executeQuery("select * from orders"); while(Rst.next()) System.out.println(Rst.getString(1)); }catch(SQLException e) { System.out.println("error"+e); }catch(ProxoolException e1){ System.out.println(e1); }finally{ try{ if (conn != null) conn.close(); }catch(SQLException e2){ System.out.println(e2); } } } } |
2、C3P0例子
c3po 下载地址:http://sourceforge.net/projects/c3p0/,必须加入的包:log4j 下载地址:http://jakarta.apache.org/log4j 。
1)特别注意:
c3p0用微软提供的数据库驱动连接sqlserver2000时(sqlserver其他版本未测试)后台会报错,但是不影响使用,这是由于微软提供的驱动与c3p0有兼容问题(主要是c3p0日志级别问题),使用第三方的驱动JTDS就不会有任何问题。
JTDS 下载地址 :http://sourceforge.net/projects/jtds/files/
2)例子:
public class Test { public static void main(String[] args) { try { ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setDriverClass("net.sourceforge.jtds.jdbc.Driver"); cpds.setJdbcUrl("jdbc:jtds:sqlserver://localhost:1433; DatabaseName=Northwind"); cpds.setUser("sa"); cpds.setPassword("sa"); cpds.setInitialPoolSize(2); cpds.setMaxPoolSize(10); cpds.setAutoCommitOnClose(true); Connection con = null; Statement stmt = null; ResultSet rs = null; con = cpds.getConnection(); stmt = con.createStatement(); rs = stmt.executeQuery("select * from orders"); while (rs.next()) { System.out.println(rs.getString(1)); } } catch (Exception e) { e.printStackTrace(); } } } |