- 首先,什么是c3p0?下面是百度百科的解釋:
C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規范和JDBC2的標准擴展。目前使用它的開源項目有Hibernate,Spring
- 使用連接池和我們平時寫的JDBC代碼相比較有什么優點呢?
- 資源重用:
由於數據庫連接得以重用,避免了頻繁創建,釋放連接引起的大量性能開銷。在減少系統消耗的基礎上,另一方面也增加了系統運行環境的平穩性。
- 更快的系統反應速度:
數據庫連接池在初始化過程中,往往已經創建了若干數據庫連接置於連接池中備用。此時連接的初始化工作均已完成。對於業務請求處理而言,直接利用現有可用連接,避免了數據庫連接初始化和釋放過程的時間開銷,從而減少了系統的響應時間。
- 新的資源分配手段:
對於多應用共享同一數據庫的系統而言,可在應用層通過數據庫連接池的配置,實現某一應用最大可用數據庫連接數的限制,避免某一應用獨占所有的數據庫資源。
- 統一的連接管理,避免數據庫連接泄露:
在較為完善的數據庫連接池實現中,可根據預先的占用超時設定,強制回收被占用連接,從而避免了常規數據庫連接操作中可能出現的資源泄露。
如何在自己的項目中使用c3p0呢?
- 導jar包:
- 兩種方式可以建立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")中即可,