轉自:http://blog.csdn.net/eclipser1987/article/details/5181320
據說c3p0數據庫連接池是最優秀的,當然這也是我道聽途說的,沒有實際證實過。今天我抽空寫了一個c3p0的例子,藉此也總結一下。
一、jar包
老規矩,引用開源項目,自然要先下載人家的jar包,我這裏有一個在雲盤:c3p0-0.9.5-pre4.jar,這裏面其實有三個包,是我在開源中國下載的最新的,如果你還想要更新的不妨自己到網上去搜一下。
二、配置文件
作爲一個數據庫連接池自然有很多參數要設置,當然就算你不設置也有默認的,不過那不一定能滿足你的要求。這裏的配置文件沒有什麼特別的要求,可以是xml也可以是properties甚至與txt都行,當然如果你願意也可以寫死在程序中。
下面是我的配置文件,我把它放在了src目錄下,名字叫“c3p0.properties”
- #jdbc基本信息
- driverClass=oracle.jdbc.driver.OracleDriver
- jdbcUrl=jdbc:oracle:thin:@127.0.0.1:1521/orcl
- user=bctts
- password=bctts123
- #c3p0連接池信息
- c3p0.minPoolSize=3
- c3p0.maxPoolSize=25
- #當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數
- c3p0.acquireIncrement=3
- #定義在從數據庫獲取新連接失敗後重復嘗試的次數
- c3p0.acquireRetryAttempts=60
- #兩次連接中間隔時間,單位毫秒
- c3p0.acquireRetryDelay=1000
- #連接關閉時默認將所有未提交的操作回滾
- c3p0.autoCommitOnClose=false
- #當連接池用完時客戶端調用getConnection()後等待獲取新連接的時間,超時後將拋出SQLException,如設爲0則無限期等待。單位毫秒
- c3p0.checkoutTimeout=3000
- #每120秒檢查所有連接池中的空閒連接。Default: 0
- c3p0.idleConnectionTestPeriod=120
- #最大空閒時間,60秒內未使用則連接被丟棄。若爲0則永不丟棄。Default: 0
- c3p0.maxIdleTime=600
- #如果設爲true那麼在取得連接的同時將校驗連接的有效性。Default: false
- c3p0.testConnectionOnCheckin=true
- #c3p0將建一張名爲c3p0TestTable的空表,並使用其自帶的查詢語句進行測試。
- jdbc.automaticTestTable = c3p0TestTable
配置文件中的內容我就不解釋了,相信你看一眼就能很明白。
三、代碼實現
c3p0的使用非常簡單,基本上就是三步搞定。
DataSource unPooled = DataSources.unpooledDataSource(url,jdbcproperties);//這裏的第二個參數放的是連接數據庫的信息,包括user、password等信息
DataSource ds = DataSources.pooledDataSource(unPooled,c3propertis);//這裏面的第二個參數放的是c3p0連接池的配置信息
Connection conn = ds.getConnection();
這三句代碼相信大家很容易看明白,也是使用c3p0連接池的核心代碼,真的很簡單。
下面是我寫的例子,僅供參考
- package com.bks.db;
- import java.io.FileInputStream;
- import java.sql.Connection;
- import java.sql.SQLException;
- import java.util.Properties;
- import javax.sql.DataSource;
- import com.mchange.v2.c3p0.DataSources;
- /**
- * c3p0連接池管理類
- * @author ICE
- *
- */
- public class C3P0ConnentionProvider {
- private static final String JDBC_DRIVER = "driverClass";
- private static final String JDBC_URL = "jdbcUrl";
- private static DataSource ds;
- /**
- * 初始化連接池代碼塊
- */
- static{
- initDBSource();
- }
- /**
- * 初始化c3p0連接池
- */
- private static final void initDBSource(){
- Properties c3p0Pro = new Properties();
- try {
- //加載配置文件
- c3p0Pro.load(new FileInputStream("./bin/c3p0.properties"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- String drverClass = c3p0Pro.getProperty(JDBC_DRIVER);
- if(drverClass != null){
- try {
- //加載驅動類
- Class.forName(drverClass);
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- Properties jdbcpropes = new Properties();
- Properties c3propes = new Properties();
- for(Object key:c3p0Pro.keySet()){
- String skey = (String)key;
- if(skey.startsWith("c3p0.")){
- c3propes.put(skey, c3p0Pro.getProperty(skey));
- }else{
- jdbcpropes.put(skey, c3p0Pro.getProperty(skey));
- }
- }
- try {
- //建立連接池
- DataSource unPooled = DataSources.unpooledDataSource(c3p0Pro.getProperty(JDBC_URL),jdbcpropes);
- ds = DataSources.pooledDataSource(unPooled,c3propes);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- /**
- * 獲取數據庫連接對象
- * @return 數據連接對象
- * @throws SQLException
- */
- public static synchronized Connection getConnection() throws SQLException{
- final Connection conn = ds.getConnection();
- conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
- return conn;
- }
- }
下面這個是測試的例子
- package test.demo;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import com.bks.db.C3P0ConnentionProvider;
- public class Demo {
- public static void main(String[] args) {
- for(int i=0;i<30;i++){
- new Thread(new Demo2()).start();
- }
- }
- }
- class Demo2 implements Runnable{
- public void run(){
- try {
- Connection conn = C3P0ConnentionProvider.getConnection();
- PreparedStatement pst = conn.prepareStatement("select to_char(sysdate,'hh24:mm:ss') tim from dual");
- ResultSet rs = pst.executeQuery();
- rs.next();
- System.out.println(Thread.currentThread().getName()+":"+rs.getString(1));
- try {
- Thread.sleep(10*1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }