qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          java數(shù)據(jù)庫(kù)連接池 dbcp 的用法

            需要下commons-dbcp  commons-pool 這兩個(gè)jar包

          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;
          }
          }

            接下來(lái),在我們的應(yīng)用中,只要簡(jiǎn)單地使用ConnectionSource.getConnection()就可以取得連接池中的數(shù)據(jù)庫(kù)連接,享受數(shù)據(jù)庫(kù)連接帶給我們的好處了。當(dāng)我們使用完取得的數(shù)據(jù)庫(kù)連接后,只要簡(jiǎn)單地使用connection.close()就可把此連接返回到連接池中,至于為什么不是直接關(guān)閉此連接,而是返回給連接池,這是因?yàn)閐bcp使用委派模型來(lái)實(shí)現(xiàn)Connection接口了。

            在使用Properties來(lái)創(chuàng)建BasicDataSource時(shí),有很多參數(shù)可以設(shè)置,比較重要的還有:

            testOnBorrow、testOnReturn、testWhileIdle,他們的意思是當(dāng)是取得連接、返回連接或連接空閑時(shí)是否進(jìn)行有效性驗(yàn)證(即是否還和數(shù)據(jù)庫(kù)連通的),默認(rèn)都為false。所以當(dāng)數(shù)據(jù)庫(kù)連接因?yàn)槟撤N原因斷掉后,再?gòu)倪B接池中取得的連接,實(shí)際上可能是無(wú)效的連接了,所以,為了確保取得的連接是有效的, 可以把把這些屬性設(shè)為true。當(dāng)進(jìn)行校驗(yàn)時(shí),需要另一個(gè)參數(shù):validationQuery,對(duì)oracle來(lái)說(shuō),可以是:SELECT COUNT(*) FROM DUAL,實(shí)際上就是個(gè)簡(jiǎn)單的SQL語(yǔ)句,驗(yàn)證時(shí),就是把這個(gè)SQL語(yǔ)句在數(shù)據(jù)庫(kù)上跑一下而已,如果連接正常的,當(dāng)然就有結(jié)果返回了。

            還有2個(gè)參數(shù):timeBetweenEvictionRunsMillis 和 minEvictableIdleTimeMillis, 他們兩個(gè)配合,可以持續(xù)更新連接池中的連接對(duì)象,當(dāng)timeBetweenEvictionRunsMillis 大于0時(shí),每過(guò)timeBetweenEvictionRunsMillis 時(shí)間,就會(huì)啟動(dòng)一個(gè)線程,校驗(yàn)連接池中閑置時(shí)間超過(guò)minEvictableIdleTimeMillis的連接對(duì)象。

          posted on 2013-09-24 10:18 順其自然EVO 閱讀(385) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 數(shù)據(jù)庫(kù)

          <2013年9月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 德惠市| 石家庄市| 上犹县| 武定县| 宜城市| 南康市| 姚安县| 阿鲁科尔沁旗| 辛集市| 乳山市| 丹凤县| 鄂托克旗| 金沙县| 化隆| 望都县| 西昌市| 康平县| 东兰县| 云安县| 剑阁县| 蒲江县| 郑州市| 屏南县| 五大连池市| 湄潭县| 瑞安市| 财经| 临潭县| 香港 | 肥西县| 汽车| 公安县| 庆元县| 新巴尔虎右旗| 沙雅县| 建始县| 南通市| 灵山县| 万荣县| 田东县| 德令哈市|