內蒙古java團隊

          j2se,j2ee開發組
          posts - 139, comments - 212, trackbacks - 0, articles - 65
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
          連接池最基本的目的:?
          1、重用連接,節省連接資源;?
          2、免去建立連接操作,提高效率
          3.?限制最大連接并發數


          自己弄的一個連接池,絕對高效安全,支持多數據源


          連接池的兩種實現方式:

          1.?修飾模式弄個ConnectionWrapper類出來?
          2.?動態代理


          這里采用的是第一種方式



          ConnectionAdapter??implements?Connetion
          ConnectionWrapper?extends?ConnectionAdapter?

          ConnectionWrapper?中封裝了connection對象
          close方法重寫為
          {
          ?SimpleConnectionPool.putConnectionToPool(this);
          ?//把連接返回連接池
          }


          配置文件?app.properties


          ConnectionAdapter?從DBCP拷貝過來,刪了些垃圾東西

          支持多數據源

          DBUtil.getConn();//獲取默認連接池
          DBUtil.getConn(pool_name);//獲取指定名稱的連接池



          各參數說明

          pool_name.dirver

          driver=net.sourceforge.jtds.jdbc.Driver
          url=jdbc:jtds:sqlserver://127.0.0.1:1433/data
          user=sa
          pwd=sa
          type=sqlserver?//數據庫類型
          pool=1????????//是否使用連接池?1?使用
          max_wait=3????//連接池已滿時,最大等待時間?,單位?s
          #timeout?,wait?time?when?max?active?,??unit?s
          max_active=20??//最大活動連接數,用這個來控制最大并發數
          min_free=3?????//連接池中最小空閑連接數
          max_free=20????//連接池中最大空閑連接數,默認=max_active
          check_sql=select?getdate()??//驗證連接是否有效,
          clear_time=2????????????????//清理空閑連接
          #clear_time,remove?the?old?connection,unit?min




          還可以用動態代理的方式實現連接池


          2.

          動態代理實現



          class?ConnectionWrapper?implements?InvocationHandler?{

          private?final?static?String?CLOSE_METHOD_NAME?=?"close";
          ??public?Connection?connection?=?null;
          ??private?Connection?m_originConnection?=?null;

          ?ConnectionWrapper(Connection?con,String?pool_name)throws?Exception?{
          ????this.pool_name=pool_name;
          ????
          ????this.check_sql?=?getCheckSqlByPoolName(pool_name);
          ????
          ????last_use_time?=?System.currentTimeMillis();
          ????create?=?StringUtil.getNowTime()+"";
          ????
          ??????Class[]?interfaces?=?{java.sql.Connection.class};
          ????this.connection?=?(Connection)?Proxy.newProxyInstance(
          ??????con.getClass().getClassLoader(),
          ??????interfaces,?this);
          ????m_originConnection?=?con;
          ??}

          ??
          ??void?close()?{
          ????//m_originConnection.close();
          ??????DBUtil.close(m_originConnection);
          ??}

          ??public?Object?invoke(Object?proxy,?Method?m,?Object[]?args)?throws?Throwable?{
          ????Object?obj?=?null;
          ????if?(CLOSE_METHOD_NAME.equals(m.getName()))?{
          ????????//SimpleConnectionPool.pushConnectionBackToPool(this);
          ????????SimpleConnectionPool.putConnectionToPool(this);
          ????????
          ????}
          ????else?{
          ????????
          ??????obj?=?m.invoke(m_originConnection,?args);
          ??????//last_use_time?=?System.currentTimeMillis();
          ????}
          ??
          ????
          ????return?obj;
          ??}
          ??

          }


          ??????????????代碼不全,只提供連接池部分代碼,學習交流用
          主站蜘蛛池模板: 祁连县| 庆阳市| 绥宁县| 盐城市| 六安市| 仁寿县| 佛学| 秦皇岛市| 三台县| 微博| 兰坪| 巴林右旗| 定远县| 枞阳县| 吉水县| 深圳市| 古丈县| 斗六市| 鹤庆县| 灌阳县| 宁蒗| 永顺县| 枣庄市| 荃湾区| 昭觉县| 上虞市| 昌江| 驻马店市| 新民市| 天峨县| 汉阴县| 泰州市| 陆河县| 攀枝花市| 赤峰市| 济阳县| 龙游县| 吉安县| 临颍县| 舞钢市| 黄浦区|