java數據庫連接池 dbcp 的用法

  1. 本文轉自:http://www.iteye.com/topic/151132

  2. 需要下commons-dbcp  commons-pool 這兩個jar包

  3. import org.apache.commons.dbcp.BasicDataSource;  
  4. import org.apache.commons.dbcp.BasicDataSourceFactory;  
  5.   
  6. import java.sql.SQLException;  
  7. import java.sql.Connection;  
  8. import java.util.Properties;  
  9.   
  10. public class ConnectionSource {  
  11.     private static BasicDataSource dataSource = null;  
  12.   
  13.     public ConnectionSource() {  
  14.     }  
  15.   
  16.     public static void init() {  
  17.   
  18.         if (dataSource != null) {  
  19.             try {  
  20.                 dataSource.close();  
  21.             } catch (Exception e) {  
  22.                 //  
  23.             }  
  24.             dataSource = null;  
  25.         }  
  26.   
  27.         try {  
  28.             Properties p = new Properties();  
  29.             p.setProperty("driverClassName""oracle.jdbc.driver.OracleDriver");  
  30.             p.setProperty("url""jdbc:oracle:thin:@192.168.0.1:1521:testDB");  
  31.             p.setProperty("password""scott");  
  32.             p.setProperty("username""tiger");  
  33.             p.setProperty("maxActive""30");  
  34.             p.setProperty("maxIdle""10");  
  35.             p.setProperty("maxWait""1000");  
  36.             p.setProperty("removeAbandoned""false");  
  37.             p.setProperty("removeAbandonedTimeout""120");  
  38.             p.setProperty("testOnBorrow""true");  
  39.             p.setProperty("logAbandoned""true");  
  40.   
  41.             dataSource = (BasicDataSource) BasicDataSourceFactory.createDataSource(p);  
  42.   
  43.         } catch (Exception e) {  
  44.             //  
  45.         }  
  46.     }  
  47.   
  48.   
  49.     public static synchronized Connection getConnection() throws  SQLException {  
  50.         if (dataSource == null) {  
  51.             init();  
  52.         }  
  53.         Connection conn = null;  
  54.         if (dataSource != null) {  
  55.             conn = dataSource.getConnection();  
  56.         }  
  57.         return conn;  
  58.     }  
  59. }  
接下來,在我們的應用中,只要簡單地使用ConnectionSource.getConnection()就可以取得連接池中的數據庫連接,享受數據庫連接帶給我們的好處了。當我們使用完取得的數據庫連接後,只要簡單地使用connection.close()就可把此連接返回到連接池中,至於爲什麼不是直接關閉此連接,而是返回給連接池,這是因爲dbcp使用委派模型來實現Connection接口了。 

      在使用Properties來創建BasicDataSource時,有很多參數可以設置,比較重要的還有: 

     testOnBorrow、testOnReturn、testWhileIdle,他們的意思是當是取得連接、返回連接或連接空閒時是否進行有效性驗證(即是否還和數據庫連通的),默認都爲false。所以當數據庫連接因爲某種原因斷掉後,再從連接池中取得的連接,實際上可能是無效的連接了,所以,爲了確保取得的連接是有效的, 可以把把這些屬性設爲true。當進行校驗時,需要另一個參數:validationQuery,對oracle來說,可以是:SELECT COUNT(*) FROM DUAL,實際上就是個簡單的SQL語句,驗證時,就是把這個SQL語句在數據庫上跑一下而已,如果連接正常的,當然就有結果返回了。 

      還有2個參數:timeBetweenEvictionRunsMillis 和 minEvictableIdleTimeMillis, 他們兩個配合,可以持續更新連接池中的連接對象,當timeBetweenEvictionRunsMillis 大於0時,每過timeBetweenEvictionRunsMillis 時間,就會啓動一個線程,校驗連接池中閒置時間超過minEvictableIdleTimeMillis的連接對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章