c3p0數據庫連接池的使用詳解

ylm 8年前發布 | 121K 次閱讀 數據庫 數據庫連接池

來自: http://www.cnblogs.com/fingerboy/p/5184398.html

  • 首先,什么是c3p0?下面是百度百科的解釋:

C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規范和JDBC2的標準擴展。目前使用它的開源項目有 Hibernate,Spring

  • 使用連接池和我們平時寫的JDBC代碼相比較有什么優點呢?
    • 資源重用 :

由于數據庫連接得以重用,避免了頻繁創建,釋放連接引起的大量性能開銷。在減少系統消耗的基礎上,另一方面也增加了系統運行環境的平穩性。

    • 更快的系統反應速度:

數據庫連接池在初始化過程中,往往已經創建了若干數據庫連接置于連接池中備用。此時連接的初始化工作均已完成。對于業務請求處理而言,直接利用現有可用連接,避免了數據庫連接初始化和釋放過程的時間開銷,從而減少了系統的響應時間。

    • 新的資源分配手段:

對于多應用共享同一數據庫的系統而言,可在應用層通過數據庫連接池的配置,實現某一應用最大可用數據庫連接數的限制,避免某一應用獨占所有的數據庫資源。

    • 統一的連接管理,避免數據庫連接泄露:

在較為完善的數據庫連接池實現中,可根據預先的占用超時設定,強制回收被占用連接,從而避免了常規數據庫連接操作中可能出現的資源泄露。

如何在自己的項目中使用c3p0呢?

  1. 導jar包:
  2. 兩種方式可以建立c3p0連接,第一種方式是代碼方式,Demo如下:
    package com.wang.utils;
    
    import java.beans.PropertyVetoException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class JDBCutils {
    
        private static Connection conn;
        private static ComboPooledDataSource ds = new ComboPooledDataSource();
    
        public static Connection getConnection() {
            try {
                ds.setDriverClass("com.mysql.jdbc.Driver");
                ds.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8&useServerPrepStmts=true&prepStmtCacheSqlLimit=256&cachePrepStmts=true&prepStmtCacheSize=256&rewriteBatchedStatements=true");
                ds.setUser("root");
                ds.setPassword("123");
                conn = ds.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (PropertyVetoException e) {
                e.printStackTrace();
            }
            return conn;
        }

    第二種是使用讀取配置文件的方式,要求是, 配置文件必須命名為c3p0-config.xml,并且放在src目錄下 ,配置文件如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <c3p0-config>
        <default-config> 
            <property name="jdbcUrl">
                <![CDATA[
                    jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8&useServerPrepStmts=true&prepStmtCacheSqlLimit=256&cachePrepStmts=true&prepStmtCacheSize=256&rewriteBatchedStatements=true
                ]]>
            </property>
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="user">root</property>
            <property name="password">123</property> 
           <!--當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 -->
            <property name="acquireIncrement">3</property>
           <!-- 初始化數據庫連接池時連接的數量 -->
            <property name="initialPoolSize">10</property>
            <!-- 數據庫連接池中的最小的數據庫連接數 -->
            <property name="minPoolSize">2</property>
            <!-- 數據庫連接池中的最大的數據庫連接數 -->
            <property name="maxPoolSize">10</property>
        </default-config>
    </c3p0-config>

    java代碼部分:

    package com.wang.utils;
    
    import java.beans.PropertyVetoException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class JDBCutils {
    
        private static Connection conn;
        private static ComboPooledDataSource ds = new ComboPooledDataSource();
    
        public static Connection getConnection() {
            try {
                conn = ds.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (PropertyVetoException e) {
                e.printStackTrace();
            }
            return conn;
        }

    注意,配置文件里可以寫多個數據庫配置,上面的配置文件代碼,我們是放在default-config標簽下,可以再添加一個用<named-config name="mysqlConfig">標簽修飾的配置,只需要在代碼中,將name的值,放在new ComboPooledDataSource("mysqlConfig")中即可,

 本文由用戶 ylm 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!