您的位置:首页 > 编程语言 > Java开发

Java连接池详解(二)

2017-05-09 19:30 549 查看



C3P0连接池

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

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

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

 



步骤1:

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

[html] view
plaincopyprint?

<c3p0-config>  

      

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

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

     

   <default-config>  

        <property name="driverClass">com.mys
4000
ql.jdbc.Driver</property>  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    </default-config>  

      

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

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

      

    <named-config name="MySQL">  

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

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

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

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

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

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

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

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

    </named-config>  

   

</c3p0-config>  

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

 




步骤2:

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

 

[java] view
plaincopyprint?

import java.sql.Connection;  

import java.sql.ResultSet;  

import java.sql.SQLException;  

import java.sql.Statement;  

import com.mchange.v2.c3p0.ComboPooledDataSource;  

   

public class JdbcUtils_C3P0 {  

     

    private static ComboPooledDataSource ds =null;  

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

    static{  

        try{  

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

            /*ds = new ComboPooledDataSource(); 

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

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

            ds.setUser("root"); 

            ds.setPassword("123456"); 

            ds.setInitialPoolSize(10); 

            ds.setMinPoolSize(5); 

            ds.setMaxPoolSize(20);*/  

             

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

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

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

             

        }catch (Exception e) {  

            throw newExceptionInInitializerError(e);  

        }  

    }  

     

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

    public static Connection getConnection()throws SQLException{  

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

        return ds.getConnection();  

    }  

     

    //释放链接  

    public static void release(Connection conn){  

        

        if(conn!=null){  

            try{  

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

                conn.close();  

            }catch (Exception e) {  

                e.printStackTrace();  

            }  

        }  

    }  

}  





步骤3:

在应用中获取连接

    

[java] view
plaincopyprint?





Connection conn = null;  

PreparedStatement st = null;  

ResultSet rs = null;  

try{  

    //获取数据库连接  

    conn = JdbcUtils_C3P0.getConnection();  

    ……  

}catch (Exception e) {  

    e.printStackTrace();  

}finally{  

    //释放资源  

    JdbcUtils_C3P0release(conn);  

}  


其他连接池


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

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

可根据项目的实际需要来选择连接池。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: