c3p0數據庫連接池的使用

轉自:http://blog.csdn.net/eclipser1987/article/details/5181320

據說c3p0數據庫連接池是最優秀的,當然這也是我道聽途說的,沒有實際證實過。今天我抽空寫了一個c3p0的例子,藉此也總結一下。

一、jar包

老規矩,引用開源項目,自然要先下載人家的jar包,我這裏有一個在雲盤:c3p0-0.9.5-pre4.jar,這裏面其實有三個包,是我在開源中國下載的最新的,如果你還想要更新的不妨自己到網上去搜一下。


二、配置文件

作爲一個數據庫連接池自然有很多參數要設置,當然就算你不設置也有默認的,不過那不一定能滿足你的要求。這裏的配置文件沒有什麼特別的要求,可以是xml也可以是properties甚至與txt都行,當然如果你願意也可以寫死在程序中。

下面是我的配置文件,我把它放在了src目錄下,名字叫“c3p0.properties”

[java] view plaincopy
  1. #jdbc基本信息  
  2. driverClass=oracle.jdbc.driver.OracleDriver  
  3. jdbcUrl=jdbc:oracle:thin:@127.0.0.1:1521/orcl  
  4. user=bctts  
  5. password=bctts123  
  6.   
  7. #c3p0連接池信息  
  8. c3p0.minPoolSize=3  
  9. c3p0.maxPoolSize=25  
  10.   
  11. #當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數  
  12. c3p0.acquireIncrement=3  
  13. #定義在從數據庫獲取新連接失敗後重復嘗試的次數  
  14. c3p0.acquireRetryAttempts=60  
  15. #兩次連接中間隔時間,單位毫秒  
  16. c3p0.acquireRetryDelay=1000  
  17. #連接關閉時默認將所有未提交的操作回滾  
  18. c3p0.autoCommitOnClose=false  
  19. #當連接池用完時客戶端調用getConnection()後等待獲取新連接的時間,超時後將拋出SQLException,如設爲0則無限期等待。單位毫秒  
  20. c3p0.checkoutTimeout=3000  
  21. #每120秒檢查所有連接池中的空閒連接。Default: 0  
  22. c3p0.idleConnectionTestPeriod=120  
  23. #最大空閒時間,60秒內未使用則連接被丟棄。若爲0則永不丟棄。Default: 0  
  24. c3p0.maxIdleTime=600  
  25. #如果設爲true那麼在取得連接的同時將校驗連接的有效性。Default: false  
  26. c3p0.testConnectionOnCheckin=true  
  27. #c3p0將建一張名爲c3p0TestTable的空表,並使用其自帶的查詢語句進行測試。  
  28. jdbc.automaticTestTable = c3p0TestTable  

配置文件中的內容我就不解釋了,相信你看一眼就能很明白。

三、代碼實現

c3p0的使用非常簡單,基本上就是三步搞定。

DataSource unPooled = DataSources.unpooledDataSource(url,jdbcproperties);//這裏的第二個參數放的是連接數據庫的信息,包括user、password等信息

DataSource ds = DataSources.pooledDataSource(unPooled,c3propertis);//這裏面的第二個參數放的是c3p0連接池的配置信息

Connection conn = ds.getConnection();

這三句代碼相信大家很容易看明白,也是使用c3p0連接池的核心代碼,真的很簡單。


下面是我寫的例子,僅供參考

[java] view plaincopy
  1. package com.bks.db;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.sql.Connection;  
  5. import java.sql.SQLException;  
  6. import java.util.Properties;  
  7.   
  8. import javax.sql.DataSource;  
  9.   
  10. import com.mchange.v2.c3p0.DataSources;  
  11.   
  12. /** 
  13.  * c3p0連接池管理類 
  14.  * @author ICE 
  15.  * 
  16.  */  
  17. public class C3P0ConnentionProvider {  
  18.   
  19.     private static final String JDBC_DRIVER = "driverClass";  
  20.     private static final String JDBC_URL = "jdbcUrl";  
  21.       
  22.     private static DataSource ds;  
  23.     /** 
  24.      * 初始化連接池代碼塊 
  25.      */  
  26.     static{  
  27.         initDBSource();  
  28.     }  
  29.       
  30.     /** 
  31.      * 初始化c3p0連接池 
  32.      */  
  33.     private static final void initDBSource(){  
  34.         Properties c3p0Pro = new Properties();  
  35.         try {  
  36.             //加載配置文件  
  37.             c3p0Pro.load(new FileInputStream("./bin/c3p0.properties"));  
  38.         } catch (Exception e) {  
  39.             e.printStackTrace();  
  40.         }   
  41.           
  42.         String drverClass = c3p0Pro.getProperty(JDBC_DRIVER);  
  43.         if(drverClass != null){  
  44.             try {  
  45.                 //加載驅動類  
  46.                 Class.forName(drverClass);  
  47.             } catch (ClassNotFoundException e) {  
  48.                 e.printStackTrace();  
  49.             }  
  50.               
  51.         }  
  52.           
  53.         Properties jdbcpropes = new Properties();  
  54.         Properties c3propes = new Properties();  
  55.         for(Object key:c3p0Pro.keySet()){  
  56.             String skey = (String)key;  
  57.             if(skey.startsWith("c3p0.")){  
  58.                 c3propes.put(skey, c3p0Pro.getProperty(skey));  
  59.             }else{  
  60.                 jdbcpropes.put(skey, c3p0Pro.getProperty(skey));  
  61.             }  
  62.         }  
  63.           
  64.         try {  
  65.             //建立連接池  
  66.             DataSource unPooled = DataSources.unpooledDataSource(c3p0Pro.getProperty(JDBC_URL),jdbcpropes);  
  67.             ds = DataSources.pooledDataSource(unPooled,c3propes);  
  68.               
  69.         } catch (SQLException e) {  
  70.             e.printStackTrace();  
  71.         }  
  72.     }  
  73.       
  74.     /** 
  75.      * 獲取數據庫連接對象 
  76.      * @return 數據連接對象 
  77.      * @throws SQLException  
  78.      */  
  79.     public static synchronized Connection getConnection() throws SQLException{  
  80.         final Connection conn = ds.getConnection();  
  81.         conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);  
  82.         return conn;  
  83.     }  
  84. }  

下面這個是測試的例子

[java] view plaincopy
  1. package test.demo;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.PreparedStatement;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7.   
  8. import com.bks.db.C3P0ConnentionProvider;  
  9.   
  10. public class Demo {  
  11.   
  12.     public static void main(String[] args) {  
  13.         for(int i=0;i<30;i++){  
  14.             new Thread(new Demo2()).start();  
  15.         }  
  16.     }  
  17.   
  18. }  
  19.   
  20. class Demo2 implements Runnable{  
  21.       
  22.     public void run(){  
  23.         try {  
  24.             Connection conn = C3P0ConnentionProvider.getConnection();  
  25.             PreparedStatement pst = conn.prepareStatement("select to_char(sysdate,'hh24:mm:ss') tim from dual");  
  26.             ResultSet rs = pst.executeQuery();  
  27.             rs.next();  
  28.             System.out.println(Thread.currentThread().getName()+":"+rs.getString(1));  
  29.             try {  
  30.                 Thread.sleep(10*1000);  
  31.             } catch (InterruptedException e) {  
  32.                 e.printStackTrace();  
  33.             }  
  34.               
  35.         } catch (SQLException e) {  
  36.             e.printStackTrace();  
  37.         }  
  38.     }  
  39. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章