(1)什么是连接池?
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
(2)Java中开源的数据库连接池
在Java中开源的数据库连接池有以下几种 :
1, C3P0 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
2,Proxool 这是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。
3,Jakarta DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用。
4,DDConnectionBroker DDConnectionBroker是一个简单,轻量级的数据库连接池。
5,DBPool DBPool是一个高效的易配置的数据库连接池。它除了支持连接池应有的功能之外,还包括了一个对象池使你能够开发一个满足自已需求的数据库连接池。
6,XAPool XAPool是一个XA数据库连接池。它实现了javax.sql.XADataSource并提供了连接池工具。
7,Primrose Primrose是一个Java开发的数据库连接池。当前支持的容器包括Tomcat4&5,Resin3与JBoss3.它同样也有一个独立的版本可以在应用程序中使用而不必运行在容器中。Primrose通过一个web接口来控制SQL处理的追踪,配置,动态池管理。在重负荷的情况下可进行连接请求队列处理。
8,SmartPool SmartPool是一个连接池组件,它模仿应用服务器对象池的特性。SmartPool能够解决一些临界问题如连接泄漏(connection leaks),连接阻塞,打开的JDBC对象如Statements,PreparedStatements等. SmartPool的特性包括支持多个pools,自动关闭相关联的JDBC对象, 在所设定time-outs之后察觉连接泄漏,追踪连接使用情况, 强制启用最近最少用到的连接,把SmartPool"包装"成现存的一个pool等。
9,MiniConnectionPoolManager MiniConnectionPoolManager是一个轻量级JDBC数据库连接池。它只需要Java1.5(或更高)并且没有依赖第三方包。
10,BoneCP BoneCP是一个快速,开源的数据库连接池。帮你管理数据连接让你的应用程序能更快速地访问数据库。比C3P0/DBCP连接池快25倍。
(3)连接池的两种实现
<1>使用JNDI实现数据库连接池(WEB容器)
首先,在Tomcat根目录/conf/context.xml文件中<Context>节点中添加<Resource>信息,内容如下:
- //这里一SQL Server 2005 为例
- <Context>
- <Resource
- name="jdbc/conn"
- auto="Container"
- type="javax.sql.DataSource"
- maxActive="100"
- maxIdle="30"
- maxWait="10000"
- username="sa"
- password="123456"
- driverManager="com.microsoft.sqlserver.jdbc.SQLServerDriver"
- url="jdbc:sqlserver://localhost:1433;databaseName=数据库名"
- />
- </Context>
其次在应用程序的WEB-INF/web.xml文件中<web-app>节点下添加<resource-ref>信息,内容如下:
- <web-app>
- <resource-ref>
- <description>对所引用的资源说明</description>
- //指定所引用资源的JNDI名字,与<Resource>元素中的name属性对应
- <res-ref-name>/jdbc/test</res-ref-name>
- //指定所引用资源的类名字,与<Resource>元素中的type属性对应
- <res-type>javax.sql.Datasource</res-type>
- //指定所引用资源的管理者名名称,与<Resource>元素中的auto属性对应
- <res-auto>Container</res-auto>
- </resource-ref>
- </web-app>
接下来,编写java类获取数据库连接对象
- import javax.naming.Context;
- import javax.naming.InitialContext;
- import javax.naming NamingException;
- import javax.sql.DataSource;
- import javax.sql.Connection;
- public class DBConnection{
- public static Conection getConnection(){
- Connection connection=null;
- try{
- Context ic=new InitialContext();
- //使用JNDI读取Tomcat安装目录/conf/context.xml文件中的配置信息
- DataSource source=(DataSource) ic.lookup("java:comp/env/test");
- //通过JNDI读取的数据源创建连接对象
- connection=source.getConnection();
- }catch(Exception e){
- e.getMessage();
- }
- return connection;
- }
- }
<2>使用proxool实现数据库连接池
首先,在应用程序的WEB-INF/lib目录下导入proxool和commons-loggin.jar架包,同时在此目录下建立proxool.properties配置文件,内容如下:
- jdbc-0.proxool.alias=mycon
- jdbc-0.proxool.driver-class=com.microsoft.sqlserver.jdbc.SQLServerDriver
- jdbcjdbc-0.proxool.driver-url=jdbc:sqlserver://localhost:1433;DataBaseName=fwxx
- jdbc-0.user=sa
- jdbc-0.password=123
- jdbc-0.prototype-count=1
- jdbc-0.proxool.maximum-connection-count=20
- jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE
- jdbc-0.proxool.statistics=1m,15m,1d
- jdbc-0.proxool.statistics-log-level=DEBUG
其次在WEB-INF/web.xml文件中注册proxool架包的加载信息,内容如下:
- <!-- 连接池 -->
- <servlet>
- <servlet-name>ServletConfigurator</servlet-name>
- <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
- <init-param>
- <param-name>propertyFile</param-name>
- <param-value>WEB-INF/proxool.properties</param-value>
- </init-param>
- <load-on-startup>0</load-on-startup>
- </servlet>
- <servlet>
- <servlet-name>Admin</servlet-name>
- <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>Admin</servlet-name>
- <url-pattern>/proxooladmin</url-pattern>
- </servlet-mapping>
接下来,编写java类获取数据库连接对象
- import javax.naming.Context;
- import javax.naming.InitialContext;
- import javax.naming NamingException;
- import javax.sql.Connection;
- public class DBConnection{
- public static Conection getConnection(){
- Connection connection=null;
- try{
- connection=DriverManager.getConnection("proxool.mycon");
- }catch(Exception e){
- e.getMessage();
- }
- return connection;
- }
- }
现学现卖,在这里和大家分享一下,交流学习。