亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

apache連接池使用

系統 2405 0

1、什么時候使用?
連接池是用來建立一些和db的連接,使用戶訪問db時可以直接使用
這些現成的連接。
? 如果不建立連接池,每個用戶每一次訪問db時都要和db建立一次連接,
這樣db server 容易產生連接過多的錯誤,用戶也會覺得速度很慢。
?? web編程,如果使用的是:客戶端---web server---db server.
這種架構的,建議使用連接池的方法處理web server與db server間的
通訊。

2、如何檢測連接池,讓連接池配置更合理?

apache連接池使用

    commons DBCP 配置參數簡要說明 
   
  在配置時,主要難以理解的主要有:removeAbandoned 、logAbandoned、removeAbandonedTimeout、maxWait這四個參數,設置了rmoveAbandoned=true那么在getNumActive()快要到getMaxActive()的時候,系統會進行無效的Connection的回收,回收的Connection為removeAbandonedTimeout(默認300秒)中設置的秒數后沒有使用的Connection,激活回收機制好像是getNumActive()=getMaxActive()-2。? 有點忘了。 
  logAbandoned=true的話,將會在回收事件后,在log中打印出回收Connection的錯誤信息,包括在哪個地方用了Connection卻忘記關閉了,在調試的時候很有用。 
  在這里私人建議maxWait的時間不要設得太長,maxWait如果設置太長那么客戶端會等待很久才激發回收事件。 
  以下是我的配置的properties文件: 
#連接設置 
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver 
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:DBSERVER 
jdbc.username=user 
jdbc.password=pass 

#<!-- 初始化連接 --> 
dataSource.initialSize=10 

#<!-- 最大空閑連接 --> 
dataSource.maxIdle=20 

#<!-- 最小空閑連接 --> 
dataSource.minIdle=5 

#最大連接數量 
dataSource.maxActive=50 

#是否在自動回收超時連接的時候打印連接的超時錯誤 
dataSource.logAbandoned=true 

#是否自動回收超時連接 
dataSource.removeAbandoned=true 

#超時時間(以秒數為單位) 
dataSource.removeAbandonedTimeout=180 

#<!-- 超時等待時間以毫秒為單位 6000毫秒/1000等于60秒 --> 
dataSource.maxWait=1000 

  以下是我在連接控制中調用的方法: 

  
Java代碼 復制代碼 ? 收藏代碼
  1. Properties??dbProps= null ; ??
  2. 取配置文件可以根據實際的不同修改 ??
  3. dbProps?=?ConfigProperties.getInstance().getProperties( "jdbc.properties" ); ??
  4. try ?{ ??
  5. ?String?driveClassName?=?dbProps.getProperty( "jdbc.driverClassName" ); ??
  6. ?String?url?=?dbProps.getProperty( "jdbc.url" ); ??
  7. ?String?username?=?dbProps.getProperty( "jdbc.username" ); ??
  8. ?String?password?=?dbProps.getProperty( "jdbc.password" ); ??
  9. ? ??
  10. ?String?initialSize?=?dbProps.getProperty( "dataSource.initialSize" ); ??
  11. ?String?minIdle?=?dbProps.getProperty( "dataSource.minIdle" ); ??
  12. ?String?maxIdle?=?dbProps.getProperty( "dataSource.maxIdle" ); ??
  13. ?String?maxWait?=?dbProps.getProperty( "dataSource.maxWait" ); ??
  14. ?String?maxActive?=?dbProps.getProperty( "dataSource.maxActive" ); ??
  15. ??? //是否在自動回收超時連接的時候打印連接的超時錯誤 ??
  16. ?? boolean ?logAbandoned?=?(Boolean.valueOf(dbProps.getProperty( "dataSource.logAbandoned" , "false" ))).booleanValue(); ??
  17. ??
  18. ?? //是否自動回收超時連接 ??
  19. ?? boolean ?removeAbandoned?=?(Boolean.valueOf(dbProps.getProperty( "dataSource.removeAbandoned" , "false" ))).booleanValue(); ??
  20. ??
  21. ?? //超時時間(以秒數為單位) ??
  22. ?? int ?removeAbandonedTimeout?=?Integer.parseInt(dbProps.getProperty( "dataSource.removeAbandonedTimeout" , "300" )); ??
  23. ??
  24. ?dataSource?=? new ?BasicDataSource(); ??
  25. ?dataSource.setDriverClassName(driveClassName); ??
  26. ?dataSource.setUrl(url); ??
  27. ?dataSource.setUsername(username); ??
  28. ?dataSource.setPassword(password); ??
  29. ??
  30. ? //初始化連接數 ??
  31. ? if (initialSize!= null ) ??
  32. ??dataSource.setInitialSize(Integer.parseInt(initialSize)); ??
  33. ? ??
  34. ? //最小空閑連接 ??
  35. ? if (minIdle!= null ) ??
  36. ??dataSource.setMinIdle(Integer.parseInt(minIdle)); ??
  37. ??
  38. ? //最大空閑連接 ??
  39. ? if (maxIdle!= null ) ??
  40. ??dataSource.setMaxIdle(Integer.parseInt(maxIdle)); ??
  41. ? ??
  42. ? //超時回收時間(以毫秒為單位) ??
  43. ? if (maxWait!= null ) ??
  44. ??dataSource.setMaxWait(Long.parseLong(maxWait)); ??
  45. ? ??
  46. ? //最大連接數 ??
  47. ? if (maxActive!= null ){ ??
  48. ?? if (!maxActive.trim().equals( "0" )) ??
  49. ???dataSource.setMaxActive(Integer.parseInt(maxActive)); ??
  50. ?} ??
  51. ??
  52. ?System.out.println( "logAbandoned=" +logAbandoned); ??
  53. ????dataSource.setLogAbandoned(logAbandoned); ??
  54. ?dataSource.setRemoveAbandoned(removeAbandoned); ??
  55. ?dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout); ??
  56. ? ??
  57. ?Connection?conn?=?dataSource.getConnection(); ??
  58. ? if (conn== null ){ ??
  59. ??log( "創建連接池時,無法取得連接!檢查設置!!!" ); ??
  60. ?} else { ??
  61. ??conn.close(); ??
  62. ?} ??
  63. ?System.out.println( "連接池創建成功!!!" ); ??
  64. } ??
  65. catch ?(Exception?e)?{ ??
  66. ?e.printStackTrace(); ??
  67. ????System.out.println( "創建連接池失敗!請檢查設置!!!" ); ??
  68. }??
            Properties  dbProps=null;
  //下面的讀取配置文件可以根據實際的不同修改
        dbProps = ConfigProperties.getInstance().getProperties("jdbc.properties");
        try {
         String driveClassName = dbProps.getProperty("jdbc.driverClassName");
         String url = dbProps.getProperty("jdbc.url");
         String username = dbProps.getProperty("jdbc.username");
         String password = dbProps.getProperty("jdbc.password");
         
         String initialSize = dbProps.getProperty("dataSource.initialSize");
         String minIdle = dbProps.getProperty("dataSource.minIdle");
         String maxIdle = dbProps.getProperty("dataSource.maxIdle");
         String maxWait = dbProps.getProperty("dataSource.maxWait");
         String maxActive = dbProps.getProperty("dataSource.maxActive");
           //是否在自動回收超時連接的時候打印連接的超時錯誤
          boolean logAbandoned = (Boolean.valueOf(dbProps.getProperty("dataSource.logAbandoned","false"))).booleanValue();

          //是否自動回收超時連接
          boolean removeAbandoned = (Boolean.valueOf(dbProps.getProperty("dataSource.removeAbandoned","false"))).booleanValue();

          //超時時間(以秒數為單位)
          int removeAbandonedTimeout = Integer.parseInt(dbProps.getProperty("dataSource.removeAbandonedTimeout","300"));
        
         dataSource = new BasicDataSource();
         dataSource.setDriverClassName(driveClassName);
         dataSource.setUrl(url);
         dataSource.setUsername(username);
         dataSource.setPassword(password);

         //初始化連接數
         if(initialSize!=null)
          dataSource.setInitialSize(Integer.parseInt(initialSize));
         
         //最小空閑連接
         if(minIdle!=null)
          dataSource.setMinIdle(Integer.parseInt(minIdle));

         //最大空閑連接
         if(maxIdle!=null)
          dataSource.setMaxIdle(Integer.parseInt(maxIdle));
         
         //超時回收時間(以毫秒為單位)
         if(maxWait!=null)
          dataSource.setMaxWait(Long.parseLong(maxWait));
         
         //最大連接數
         if(maxActive!=null){
          if(!maxActive.trim().equals("0"))
           dataSource.setMaxActive(Integer.parseInt(maxActive));
         }

         System.out.println("logAbandoned="+logAbandoned);
            dataSource.setLogAbandoned(logAbandoned);
         dataSource.setRemoveAbandoned(removeAbandoned);
         dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout);
         
         Connection conn = dataSource.getConnection();
         if(conn==null){
          log("創建連接池時,無法取得連接!檢查設置!!!");
         }else{
          conn.close();
         }
         System.out.println("連接池創建成功!!!");
        }
        catch (Exception e) {
         e.printStackTrace();
            System.out.println("創建連接池失敗!請檢查設置!!!");
        }


  


用apache的dbcp來建立獨立的數據庫連接池(db connection pool)
數據庫連接池的好處是不言而喻的,現在大部分的application server都提供自己的數據庫連接池方案,此時,只要按照application server的文檔說明,正確配置,即可在應用中享受到數據庫連接池的好處。
但是,有些時候,我們的應用是個獨立的java application,并不是普通的WEB/J2EE應用,而且是單獨運行的,不要什么application server的配合,這種情況下,我們就需要建立自己的數據庫連接池方案了。這里,介紹如何利用apache的dbcp來建立為民自己的數據庫連接池。
1。首先,下載必須的jar包
dbcp包,目前版本是1.2.1:http://jakarta.apache.org/commons/dbcp/
pool包,目前版本是1.3:http://jakarta.apache.org/commons/pool/,
如果下載的pool包是1.2的版本,還要下載common-collections包:http://jakarta.apache.org/commons/collections/
在建立我們自己的數據庫連接池時,可以使用xml文件來傳入需要的參數,這里只使用hard code的方式來簡單介紹,所有需要我們自己寫的代碼很少,只要建立一個文件如下:

Java代碼 復制代碼 ? 收藏代碼
  1. import ?org.apache.commons.dbcp.BasicDataSource; ??
  2. import ?org.apache.commons.dbcp.BasicDataSourceFactory; ??
  3. ??
  4. import ?java.sql.SQLException; ??
  5. import ?java.sql.Connection; ??
  6. import ?java.util.Properties; ??
  7. ??
  8. public ? class ?ConnectionSource?{ ??
  9. ???? private ? static ?BasicDataSource?dataSource?=? null ; ??
  10. ??
  11. ???? public ?ConnectionSource()?{ ??
  12. ????} ??
  13. ??
  14. ???? public ? static ? void ?init()?{ ??
  15. ??
  16. ???????? if ?(dataSource?!=? null )?{ ??
  17. ???????????? try ?{ ??
  18. ????????????????dataSource.close(); ??
  19. ????????????}? catch ?(Exception?e)?{ ??
  20. ???????????????? // ??
  21. ????????????} ??
  22. ????????????dataSource?=? null ; ??
  23. ????????} ??
  24. ??
  25. ???????? try ?{ ??
  26. ????????????Properties?p?=? new ?Properties(); ??
  27. ????????????p.setProperty( "driverClassName" ,? "oracle.jdbc.driver.OracleDriver" ); ??
  28. ????????????p.setProperty( "url" ,? "jdbc:oracle:thin:@192.168.0.1:1521:testDB" ); ??
  29. ????????????p.setProperty( "password" ,? "scott" ); ??
  30. ????????????p.setProperty( "username" ,? "tiger" ); ??
  31. ????????????p.setProperty( "maxActive" ,? "30" ); ??
  32. ????????????p.setProperty( "maxIdle" ,? "10" ); ??
  33. ????????????p.setProperty( "maxWait" ,? "1000" ); ??
  34. ????????????p.setProperty( "removeAbandoned" ,? "false" ); ??
  35. ????????????p.setProperty( "removeAbandonedTimeout" ,? "120" ); ??
  36. ????????????p.setProperty( "testOnBorrow" ,? "true" ); ??
  37. ????????????p.setProperty( "logAbandoned" ,? "true" ); ??
  38. ??
  39. ????????????dataSource?=?(BasicDataSource)?BasicDataSourceFactory.createDataSource(p); ??
  40. ??
  41. ????????}? catch ?(Exception?e)?{ ??
  42. ???????????? // ??
  43. ????????} ??
  44. ????} ??
  45. ??
  46. ??
  47. ???? public ? static ? synchronized ?Connection?getConnection()? throws ??SQLException?{ ??
  48. ???????? if ?(dataSource?==? null )?{ ??
  49. ????????????init(); ??
  50. ????????} ??
  51. ????????Connection?conn?=? null ; ??
  52. ???????? if ?(dataSource?!=? null )?{ ??
  53. ????????????conn?=?dataSource.getConnection(); ??
  54. ????????} ??
  55. ???????? return ?conn; ??
  56. ????} ??
  57. }??
    import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

import java.sql.SQLException;
import java.sql.Connection;
import java.util.Properties;

public class ConnectionSource {
    private static BasicDataSource dataSource = null;

    public ConnectionSource() {
    }

    public static void init() {

        if (dataSource != null) {
            try {
                dataSource.close();
            } catch (Exception e) {
                //
            }
            dataSource = null;
        }

        try {
            Properties p = new Properties();
            p.setProperty("driverClassName", "oracle.jdbc.driver.OracleDriver");
            p.setProperty("url", "jdbc:oracle:thin:@192.168.0.1:1521:testDB");
            p.setProperty("password", "scott");
            p.setProperty("username", "tiger");
            p.setProperty("maxActive", "30");
            p.setProperty("maxIdle", "10");
            p.setProperty("maxWait", "1000");
            p.setProperty("removeAbandoned", "false");
            p.setProperty("removeAbandonedTimeout", "120");
            p.setProperty("testOnBorrow", "true");
            p.setProperty("logAbandoned", "true");

            dataSource = (BasicDataSource) BasicDataSourceFactory.createDataSource(p);

        } catch (Exception e) {
            //
        }
    }


    public static synchronized Connection getConnection() throws  SQLException {
        if (dataSource == null) {
            init();
        }
        Connection conn = null;
        if (dataSource != null) {
            conn = dataSource.getConnection();
        }
        return conn;
    }
}


  


接下來,在我們的應用中,只要簡單地使用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的連接對象。

原文參考 http://blog.csdn.net/zllsdn/archive/2006/11/20/1398577.aspx

?

apache連接池使用


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲精品久久久久久动漫剧情 | 雅虎日本免费一区二区三区 | 久久精品午夜视频 | 亚洲国产精品久久久久婷婷软件 | 国产免费福利 | 四虎永久网址在线观看 | 欧美日韩永久久一区二区三区 | 国产亚洲一欧美一区二区三区 | 色综合久久天天综合绕观看 | 999精品视频在线观看 | 手机看高清特黄a大片 | 日本爱爱网站 | 天天爽夜夜爽精品视频一 | 日韩精品一区二区三区 在线观看 | 99久久国产综合精品五月天 | 成人性视频免费网站 | 婷婷综合激情五月中文字幕 | 国产色视频 | 四虎影视免费观看免费观看 | 四虎最新在线 | 日韩a级片视频 | 久久精品免视看国产陈冠希 | 成人一级黄色片 | 国产精品第三页在线看 | 天堂亚洲国产日韩在线看 | 国产精品福利在线观看 | 亚洲成人网在线观看 | 啪啪一级片 | 亚洲天堂一区在线 | 香蕉人人超人人超免费看视频 | 琪琪色播| 伊人激情久久综合中文字幕 | 国产精品福利一区二区久久 | 亚洲一区二区久久 | 中文字幕日韩高清 | 亚洲人成免费网站 | 在线精品国内视频秒播 | 国产欧美在线播放 | 黄色毛片小视频 | 日韩国产成人精品视频人 | 日韩一级片 |