Java连接池详解(二)

来源:互联网 发布:腾达ac6 访客网络限速 编辑:程序博客网 时间:2024/06/11 02:06

C3P0连接池

c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0一般是与Hibernate,Spring等框架一块使用的,当然也可以单独使用。

dbcp没有自动回收空闲连接的功能,c3p0有自动回收空闲连接功能

使用c3p0需要导入c3p0.jarmchange-commons-.jar,如果操作的是Oracle数据库,那么还需要导入c3p0-oracle-thin-extras-pre1.jar。

 

步骤1:

在类目录下加入C3P0的配置文件:c3p0-config.xml


[html] view plaincopyprint?

  1. <c3p0-config>  

  2.       

  3.    <!--  C3P0的缺省(默认)配置,-->  

  4.    <!-- 如果在代码中“ComboPooledDataSourceds = new ComboPooledDataSource();”这样写就表示使用的是C3P0的缺省(默认)配置信息来创建数据源 -->  

  5.      

  6.    <default-config>  

  7.         <property name="driverClass">com.mysql.jdbc.Driver</property>  

  8.         <property name="jdbcUrl">jdbc:mysql://localhost:3306/anysearch</property>  

  9.         <property name="user">root</property>  

  10.         <property name="password">123456</property>  

  11.              <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default:3 -->  

  12.         <property name="acquireIncrement">5</property>  

  13.              <!--初始化的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3-->  

  14.         <property name="initialPoolSize">10</property>  

  15.              <!--连接池中保留的最小连接数-->  

  16.         <property name="minPoolSize">5</property>  

  17.              <!--连接池中保留的最大连接数。Default:15 -->  

  18.         <property name="maxPoolSize">20</property>  

  19.              <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->  

  20.         <property name="acquireRetryAttempts">30</property>  

  21.              <!--两次连接中间隔时间,单位毫秒。Default: 1000 -->  

  22.         <property name="acquireRetryDelay">1000</property>  

  23.              <!--连接关闭时默认将所有未提交的操作回滚。Default: false -->  

  24.          <property name="autoCommitOnClose">false</property>  

  25.     </default-config>  

  26.       

  27.     <!-- C3P0的命名配置,-->  

  28.     <!-- 如果在代码中“ComboPooledDataSourceds = new ComboPooledDataSource("MySQL");”这样写就表示使用的是name是MySQL的配置信息来创建数据源 -->  

  29.       

  30.     <named-config name="MySQL">  

  31.         <property name="driverClass">com.mysql.jdbc.Driver</property>  

  32.         <property name="jdbcUrl">jdbc:mysql://localhost:3306/test2</property>  

  33.         <property name="user">root</property>  

  34.         <property name="password">123456</property>  

  35.         <property name="acquireIncrement">5</property>  

  36.         <property name="initialPoolSize">10</property>  

  37.         <property name="minPoolSize">5</property>  

  38.         <property name="maxPoolSize">20</property>  

  39.     </named-config>  

  40.    

  41. </c3p0-config>  


还有更多可设置的参数,具体可查阅相关资料。

 

步骤2:

在获取数据库连接的工具类(如jdbcUtils)的静态代码块中创建池

 


[java] view plaincopyprint?

  1. import java.sql.Connection;  

  2. import java.sql.ResultSet;  

  3. import java.sql.SQLException;  

  4. import java.sql.Statement;  

  5. import com.mchange.v2.c3p0.ComboPooledDataSource;  

  6.    

  7. public class JdbcUtils_C3P0 {  

  8.      

  9.     private static ComboPooledDataSource ds =null;  

  10.     //在静态代码块中创建数据库连接池  

  11.     static{  

  12.         try{  

  13.             //通过代码创建C3P0数据库连接池  

  14.             /*ds = new ComboPooledDataSource(); 

  15.            ds.setDriverClass("com.mysql.jdbc.Driver"); 

  16.            ds.setJdbcUrl("jdbc:mysql://localhost:3306/test"); 

  17.             ds.setUser("root"); 

  18.             ds.setPassword("123456"); 

  19.             ds.setInitialPoolSize(10); 

  20.             ds.setMinPoolSize(5); 

  21.             ds.setMaxPoolSize(20);*/  

  22.              

  23.             //通过读取C3P0的xml配置文件创建数据源,C3P0的xml配置文件c3p0-config.xml必须放在src目录下  

  24.             //ds = newComboPooledDataSource();//使用C3P0的默认配置来创建数据源  

  25.             ds = newComboPooledDataSource("MySQL");//使用C3P0的命名配置来创建数据源  

  26.              

  27.         }catch (Exception e) {  

  28.             throw newExceptionInInitializerError(e);  

  29.         }  

  30.     }  

  31.      

  32.    //从数据源中获取数据库连接  

  33.     public static Connection getConnection()throws SQLException{  

  34.         //从数据源中获取数据库连接  

  35.         return ds.getConnection();  

  36.     }  

  37.      

  38.     //释放链接  

  39.     public static void release(Connection conn){  

  40.         

  41.         if(conn!=null){  

  42.             try{  

  43.                 //将Connection连接对象还给数据库连接池  

  44.                 conn.close();  

  45.             }catch (Exception e) {  

  46.                 e.printStackTrace();  

  47.             }  

  48.         }  

  49.     }  

  50. }  

步骤3:

在应用中获取连接

    

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. Connection conn = null;  

  2. PreparedStatement st = null;  

  3. ResultSet rs = null;  

  4. try{  

  5.     //获取数据库连接  

  6.     conn = JdbcUtils_C3P0.getConnection();  

  7.     ……  

  8. }catch (Exception e) {  

  9.     e.printStackTrace();  

  10. }finally{  

  11.     //释放资源  

  12.     JdbcUtils_C3P0release(conn);  

  13. }  



其他连接池

此外,还有其他的连接池可供选择,比如使用比较广泛的Proxool。Proxool是一种Java数据库连接池技术。是sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。

proxool和 c3p0能够更好的支持高并发,但是在稳定性方面略逊于dpcp。

可根据项目的实际需要来选择连接池。

0 0
原创粉丝点击