欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C3P0连接池的使用

程序员文章站 2024-01-06 13:05:58
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展,设计非常简单易用 C3P0的基本使用 添加maven依赖 编写C3P0工具类 classpath下面配置文件 c3p0 config.xml 测试代码 C3P0的其他细化配置 ......

c3p0是一个开源的jdbc连接池,它实现了数据源和jndi绑定,支持jdbc3规范和jdbc2的标准扩展,设计非常简单易用

c3p0的基本使用

添加maven依赖

 <dependency>
            <groupid>mysql</groupid>
            <artifactid>mysql-connector-java</artifactid>
            <version>5.1.44</version>
        </dependency>
        <dependency>
            <groupid>com.mchange</groupid>
            <artifactid>c3p0</artifactid>
            <version>0.9.5</version>
        </dependency>

编写c3p0工具类

public class c3p0utils {
    private static combopooleddatasource datasource = new combopooleddatasource("mysql");

    public static datasource getdatasource() {
        return datasource;
    }

    public static connection getconnection() {
        try {
            return datasource.getconnection();
        } catch (sqlexception e) {
            throw new runtimeexception(e);
        }
    }

    //释放连接回连接池
    public static void close(connection conn, preparedstatement pst, resultset rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (sqlexception e) {
                e.printstacktrace();
            }
        }
        if (pst != null) {
            try {
                pst.close();
            } catch (sqlexception e) {
                e.printstacktrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (sqlexception e) {
                e.printstacktrace();
            }
        }
    }
}

classpath下面配置文件
c3p0-config.xml

<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>

    <default-config>
        <property name="driverclass">com.mysql.jdbc.driver</property>
        <property name="jdbcurl">jdbc:mysql://192.168.47.151:3306/web</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="initialpoolsize">5</property>
        <property name="maxpoolsize">20</property>
    </default-config>

    <named-config name="mysql">
        <property name="driverclass">com.mysql.jdbc.driver</property>
        <property name="jdbcurl">jdbc:mysql://192.168.47.151:3306/web</property>
        <property name="user">root</property>
        <property name="password">root</property>
    </named-config>


</c3p0-config>

测试代码

 @test
    public void test1(){
        connection conn = null;
        preparedstatement pstmt = null;
        // 1.创建自定义连接池对象
        datasource datasource = new datasourcepool();
        try {
            // 2.从池子中获取连接
            conn = c3p0utils.getconnection();
            string sql = "insert into user values(?,?)";
            //3.必须在自定义的connection类中重写preparestatement(sql)方法
            pstmt = conn.preparestatement(sql);
            pstmt.setstring(1, "李四");
            pstmt.setstring(2, "1234");
            int rows = pstmt.executeupdate();
            system.out.println("rows:"+rows);
        } catch (exception e) {
            throw new runtimeexception(e);
        } finally {
            c3p0utils.close(conn,pstmt,null);
        }
    }

c3p0的其他细化配置

<!--acquireincrement:链接用完了自动增量3个。 -->
    <property name="acquireincrement">3</property>

    <!--acquireretryattempts:链接失败后重新试30次。-->
    <property name="acquireretryattempts">30</property>
 
    <!--acquireretrydelay;两次连接中间隔1000毫秒。 -->
    <property name="acquireretrydelay">1000</property>
 
    <!--autocommitonclose:连接关闭时默认将所有未提交的操作回滚。 -->
    <property name="autocommitonclose">false</property>
 
    <!--automatictesttable:c3p0测试表,没什么用。-->
    <property name="automatictesttable">test</property>
 
    <!--breakafteracquirefailure:出错时不把正在提交的数据抛弃。-->
    <property name="breakafteracquirefailure">false</property>
 
    <!--checkouttimeout:100毫秒后如果sql数据没有执行完将会报错,如果设置成0,那么将会无限的等待。 --> 
    <property name="checkouttimeout">100</property>
 
    <!--connectiontesterclassname:通过实现connectiontester或queryconnectiontester的类来测试连接。类名需制定全路径。default: com.mchange.v2.c3p0.impl.defaultconnectiontester-->
    <property name="connectiontesterclassname"></property>
 
    <!--factoryclasslocation:指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可。-->
    <property name="factoryclasslocation">null</property>
 
    <!--forceignoreunresolvedtransactions:作者强烈建议不使用的一个属性。--> 
    <property name="forceignoreunresolvedtransactions">false</property>
 
    <!--idleconnectiontestperiod:每60秒检查所有连接池中的空闲连接。--> 
    <property name="idleconnectiontestperiod">60</property>
 
    <!--initialpoolsize:初始化时获取三个连接,取值应在minpoolsize与maxpoolsize之间。 --> 
    <property name="initialpoolsize">3</property>
 
    <!--maxidletime:最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。-->
    <property name="maxidletime">60</property>
 
    <!--maxpoolsize:连接池中保留的最大连接数。 -->
    <property name="maxpoolsize">15</property>
 
    <!--maxstatements:最大链接数。-->
    <property name="maxstatements">100</property>
 
    <!--maxstatementsperconnection:定义了连接池内单个连接所拥有的最大缓存statements数。default: 0  -->
    <property name="maxstatementsperconnection"></property>
 
    <!--numhelperthreads:异步操作,提升性能通过多线程实现多个操作同时被执行。default: 3--> 
    <property name="numhelperthreads">3</property>
 
    <!--overridedefaultuser:当用户调用getconnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0的数据源时。default: null--> 
    <property name="overridedefaultuser">root</property>
 
    <!--overridedefaultpassword:与overridedefaultuser参数对应使用的一个参数。default: null-->
    <property name="overridedefaultpassword">password</property>
 
    <!--password:密码。default: null--> 
    <property name="password"></property>
 
    <!--preferredtestquery:定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意: 测试的表必须在初始数据源的时候就存在。default: null-->
    <property name="preferredtestquery">select id from test where id=1</property>
 
    <!--propertycycle:用户修改系统配置参数执行前最多等待300秒。default: 300 --> 
    <property name="propertycycle">300</property>
 
    <!--testconnectiononcheckout:因性能消耗大请只在需要的时候使用它。default: false -->
    <property name="testconnectiononcheckout">false</property>
 
    <!--testconnectiononcheckin:如果设为true那么在取得连接的同时将校验连接的有效性。default: false -->
    <property name="testconnectiononcheckin">true</property>
 
    <!--user:用户名。default: null-->
    <property name="user">root</property>
 
    <!--usestraditionalreflectiveproxies:动态反射代理。default: false-->
    <property name="usestraditionalreflectiveproxies">false</property>

上一篇:

下一篇: