日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

JAVA数据库连接池实现

發布時間:2023/12/3 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA数据库连接池实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自? ?JAVA數據庫連接池實現

連接池的管理用了了享元模式,這里對連接池進行簡單設計。

一、設計思路

? ? ?1.連接池配置屬性DBbean:里面存放可以配置的一些屬性

? ? ?2.連接池接口IConnectionPool:里面定義一些基本的獲取連接的一些方法

? ? ?3.接口實現ConnectionPool:對上面操作進行實現,并加入一些其他方法

? ? ?4.連接池管理ConnectionPoolManager:管理所有的不同的連接池,所有的連接都能通過這里進行獲得連接

? ? ?5.另外還有幾個測試類,和連接信息模擬的類,這里就不進行xml 和配置文件信息的讀取了

  • package?pool;??
  • /**?
  • ?*?這是外部可以配置的連接池屬性?
  • ?*?可以允許外部配置,擁有默認值?
  • ?*?@author?Ran?
  • ?*?
  • ?*/??
  • public?class?DBbean?{??
  • ????//?連接池屬性??
  • ????private?String?driverName;??
  • ????private?String?url;??
  • ????private?String?userName;??
  • ????private?String?password;??
  • ????//?連接池名字??
  • ????private?String?poolName;??
  • ????private?int?minConnections?=?1;?//?空閑池,最小連接數??
  • ????private?int?maxConnections?=?10;?//?空閑池,最大連接數??
  • ??????
  • ????private?int?initConnections?=?5;//?初始化連接數??
  • ??????
  • ????private?long?connTimeOut?=?1000;//?重復獲得連接的頻率??
  • ??????
  • ????private?int?maxActiveConnections?=?100;//?最大允許的連接數,和數據庫對應??
  • ??????
  • ????private?long?connectionTimeOut?=?1000*60*20;//?連接超時時間,默認20分鐘??
  • ??????
  • ????private?boolean?isCurrentConnection?=?true;?//?是否獲得當前連接,默認true??
  • ??????
  • ????private?boolean?isCheakPool?=?true;?//?是否定時檢查連接池??
  • ????private?long?lazyCheck?=?1000*60*60;//?延遲多少時間后開始?檢查??
  • ????private?long?periodCheck?=?1000*60*60;//?檢查頻率??
  • ??????
  • ??????
  • ??????
  • ????public?DBbean(String?driverName,?String?url,?String?userName,??
  • ????????????String?password,?String?poolName)?{??
  • ????????super();??
  • ????????this.driverName?=?driverName;??
  • ????????this.url?=?url;??
  • ????????this.userName?=?userName;??
  • ????????this.password?=?password;??
  • ????????this.poolName?=?poolName;??
  • ????}??
  • ????public?DBbean()?{??
  • ????}??
  • ????public?String?getDriverName()?{??
  • ????????if(driverName?==?null){??
  • ????????????driverName?=?this.getDriverName()+"_"+this.getUrl();??
  • ????????}??
  • ????????return?driverName;??
  • ????}??
  • ????public?void?setDriverName(String?driverName)?{??
  • ????????this.driverName?=?driverName;??
  • ????}??
  • ????public?String?getUrl()?{??
  • ????????return?url;??
  • ????}??
  • ????public?void?setUrl(String?url)?{??
  • ????????this.url?=?url;??
  • ????}??
  • ????public?String?getUserName()?{??
  • ????????return?userName;??
  • ????}??
  • ????public?void?setUserName(String?userName)?{??
  • ????????this.userName?=?userName;??
  • ????}??
  • ????public?String?getPassword()?{??
  • ????????return?password;??
  • ????}??
  • ????public?void?setPassword(String?password)?{??
  • ????????this.password?=?password;??
  • ????}??
  • ????public?String?getPoolName()?{??
  • ????????return?poolName;??
  • ????}??
  • ????public?void?setPoolName(String?poolName)?{??
  • ????????this.poolName?=?poolName;??
  • ????}??
  • ????public?int?getMinConnections()?{??
  • ????????return?minConnections;??
  • ????}??
  • ????public?void?setMinConnections(int?minConnections)?{??
  • ????????this.minConnections?=?minConnections;??
  • ????}??
  • ????public?int?getMaxConnections()?{??
  • ????????return?maxConnections;??
  • ????}??
  • ????public?void?setMaxConnections(int?maxConnections)?{??
  • ????????this.maxConnections?=?maxConnections;??
  • ????}??
  • ????public?int?getInitConnections()?{??
  • ????????return?initConnections;??
  • ????}??
  • ????public?void?setInitConnections(int?initConnections)?{??
  • ????????this.initConnections?=?initConnections;??
  • ????}??
  • ??
  • ????public?int?getMaxActiveConnections()?{??
  • ????????return?maxActiveConnections;??
  • ????}??
  • ????public?void?setMaxActiveConnections(int?maxActiveConnections)?{??
  • ????????this.maxActiveConnections?=?maxActiveConnections;??
  • ????}??
  • ????public?long?getConnTimeOut()?{??
  • ????????return?connTimeOut;??
  • ????}??
  • ????public?void?setConnTimeOut(long?connTimeOut)?{??
  • ????????this.connTimeOut?=?connTimeOut;??
  • ????}??
  • ????public?long?getConnectionTimeOut()?{??
  • ????????return?connectionTimeOut;??
  • ????}??
  • ????public?void?setConnectionTimeOut(long?connectionTimeOut)?{??
  • ????????this.connectionTimeOut?=?connectionTimeOut;??
  • ????}??
  • ????public?boolean?isCurrentConnection()?{??
  • ????????return?isCurrentConnection;??
  • ????}??
  • ????public?void?setCurrentConnection(boolean?isCurrentConnection)?{??
  • ????????this.isCurrentConnection?=?isCurrentConnection;??
  • ????}??
  • ????public?long?getLazyCheck()?{??
  • ????????return?lazyCheck;??
  • ????}??
  • ????public?void?setLazyCheck(long?lazyCheck)?{??
  • ????????this.lazyCheck?=?lazyCheck;??
  • ????}??
  • ????public?long?getPeriodCheck()?{??
  • ????????return?periodCheck;??
  • ????}??
  • ????public?void?setPeriodCheck(long?periodCheck)?{??
  • ????????this.periodCheck?=?periodCheck;??
  • ????}??
  • ????public?boolean?isCheakPool()?{??
  • ????????return?isCheakPool;??
  • ????}??
  • ????public?void?setCheakPool(boolean?isCheakPool)?{??
  • ????????this.isCheakPool?=?isCheakPool;??
  • ????}??
  • ??????
  • ??????
  • ??????
  • }??
  • ?

    Java代碼??
  • package?pool;??
  • ??
  • import?java.sql.Connection;??
  • import?java.sql.SQLException;??
  • ??
  • public?interface?IConnectionPool?{??
  • ????//?獲得連接??
  • ????public?Connection??getConnection();??
  • ????//?獲得當前連接??
  • ????public?Connection?getCurrentConnecton();??
  • ????//?回收連接??
  • ????public?void?releaseConn(Connection?conn)?throws?SQLException;??
  • ????//?銷毀清空??
  • ????public?void?destroy();??
  • ????//?連接池是活動狀態??
  • ????public?boolean?isActive();??
  • ????//?定時器,檢查連接池??
  • ????public?void?cheackPool();??
  • }??

  • package?pool;??
  • ??
  • import?java.sql.Connection;??
  • import?java.sql.DriverManager;??
  • import?java.sql.SQLException;??
  • import?java.util.List;??
  • import?java.util.Timer;??
  • import?java.util.TimerTask;??
  • import?java.util.Vector;??
  • ??
  • public?class?ConnectionPool?implements?IConnectionPool?{??
  • ????//?連接池配置屬性??
  • ????private?DBbean?dbBean;??
  • ????private?boolean?isActive?=?false;?//?連接池活動狀態??
  • ????private?int?contActive?=?0;//?記錄創建的總的連接數??
  • ??????
  • ????//?空閑連接??
  • ????private?List<Connection>?freeConnection?=?new?Vector<Connection>();??
  • ????//?活動連接??
  • ????private?List<Connection>?activeConnection?=?new?Vector<Connection>();??
  • ????//?將線程和連接綁定,保證事務能統一執行??
  • ????private?static?ThreadLocal<Connection>?threadLocal?=?new?ThreadLocal<Connection>();??
  • ??????
  • ????public?ConnectionPool(DBbean?dbBean)?{??
  • ????????super();??
  • ????????this.dbBean?=?dbBean;??
  • ????????init();??
  • ????????cheackPool();??
  • ????}??
  • ??
  • ????//?初始化??
  • ????public?void?init()?{??
  • ????????try?{??
  • ????????????Class.forName(dbBean.getDriverName());??
  • ????????????for?(int?i?=?0;?i?<?dbBean.getInitConnections();?i++)?{??
  • ????????????????Connection?conn;??
  • ????????????????conn?=?newConnection();??
  • ????????????????//?初始化最小連接數??
  • ????????????????if?(conn?!=?null)?{??
  • ????????????????????freeConnection.add(conn);??
  • ????????????????????contActive++;??
  • ????????????????}??
  • ????????????}??
  • ????????????isActive?=?true;??
  • ????????}?catch?(ClassNotFoundException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}?catch?(SQLException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????}??
  • ??????
  • ????//?獲得當前連接??
  • ????public?Connection?getCurrentConnecton(){??
  • ????????//?默認線程里面取??
  • ????????Connection?conn?=?threadLocal.get();??
  • ????????if(!isValid(conn)){??
  • ????????????conn?=?getConnection();??
  • ????????}??
  • ????????return?conn;??
  • ????}??
  • ??
  • ????//?獲得連接??
  • ????public?synchronized?Connection?getConnection()?{??
  • ????????Connection?conn?=?null;??
  • ????????try?{??
  • ????????????//?判斷是否超過最大連接數限制??
  • ????????????if(contActive?<?this.dbBean.getMaxActiveConnections()){??
  • ????????????????if?(freeConnection.size()?>?0)?{??
  • ????????????????????conn?=?freeConnection.get(0);??
  • ????????????????????if?(conn?!=?null)?{??
  • ????????????????????????threadLocal.set(conn);??
  • ????????????????????}??
  • ????????????????????freeConnection.remove(0);??
  • ????????????????}?else?{??
  • ????????????????????conn?=?newConnection();??
  • ????????????????}??
  • ??????????????????
  • ????????????}else{??
  • ????????????????//?繼續獲得連接,直到從新獲得連接??
  • ????????????????wait(this.dbBean.getConnTimeOut());??
  • ????????????????conn?=?getConnection();??
  • ????????????}??
  • ????????????if?(isValid(conn))?{??
  • ????????????????activeConnection.add(conn);??
  • ????????????????contActive?++;??
  • ????????????}??
  • ????????}?catch?(SQLException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}?catch?(ClassNotFoundException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}?catch?(InterruptedException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????????return?conn;??
  • ????}??
  • ??
  • ????//?獲得新連接??
  • ????private?synchronized?Connection?newConnection()??
  • ????????????throws?ClassNotFoundException,?SQLException?{??
  • ????????Connection?conn?=?null;??
  • ????????if?(dbBean?!=?null)?{??
  • ????????????Class.forName(dbBean.getDriverName());??
  • ????????????conn?=?DriverManager.getConnection(dbBean.getUrl(),??
  • ????????????????????dbBean.getUserName(),?dbBean.getPassword());??
  • ????????}??
  • ????????return?conn;??
  • ????}??
  • ??
  • ????//?釋放連接??
  • ????public?synchronized?void?releaseConn(Connection?conn)?throws?SQLException?{??
  • ????????if?(isValid(conn)&&?!(freeConnection.size()?>?dbBean.getMaxConnections()))?{??
  • ????????????freeConnection.add(conn);??
  • ????????????activeConnection.remove(conn);??
  • ????????????contActive?--;??
  • ????????????threadLocal.remove();??
  • ????????????//?喚醒所有正待等待的線程,去搶連接??
  • ????????????notifyAll();??
  • ????????}??
  • ????}??
  • ??
  • ????//?判斷連接是否可用??
  • ????private?boolean?isValid(Connection?conn)?{??
  • ????????try?{??
  • ????????????if?(conn?==?null?||?conn.isClosed())?{??
  • ????????????????return?false;??
  • ????????????}??
  • ????????}?catch?(SQLException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????????return?true;??
  • ????}??
  • ??
  • ????//?銷毀連接池??
  • ????public?synchronized?void?destroy()?{??
  • ????????for?(Connection?conn?:?freeConnection)?{??
  • ????????????try?{??
  • ????????????????if?(isValid(conn))?{??
  • ????????????????????conn.close();??
  • ????????????????}??
  • ????????????}?catch?(SQLException?e)?{??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????}??
  • ????????for?(Connection?conn?:?activeConnection)?{??
  • ????????????try?{??
  • ????????????????if?(isValid(conn))?{??
  • ????????????????????conn.close();??
  • ????????????????}??
  • ????????????}?catch?(SQLException?e)?{??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????}??
  • ????????isActive?=?false;??
  • ????????contActive?=?0;??
  • ????}??
  • ??
  • ????//?連接池狀態??
  • ????@Override??
  • ????public?boolean?isActive()?{??
  • ????????return?isActive;??
  • ????}??
  • ??????
  • ????//?定時檢查連接池情況??
  • ????@Override??
  • ????public?void?cheackPool()?{??
  • ????????if(dbBean.isCheakPool()){??
  • ????????????new?Timer().schedule(new?TimerTask()?{??
  • ????????????@Override??
  • ????????????public?void?run()?{??
  • ????????????//?1.對線程里面的連接狀態??
  • ????????????//?2.連接池最小?最大連接數??
  • ????????????//?3.其他狀態進行檢查,因為這里還需要寫幾個線程管理的類,暫時就不添加了??
  • ????????????System.out.println("空線池連接數:"+freeConnection.size());??
  • ????????????System.out.println("活動連接數::"+activeConnection.size());??
  • ????????????System.out.println("總的連接數:"+contActive);??
  • ????????????????}??
  • ????????????},dbBean.getLazyCheck(),dbBean.getPeriodCheck());??
  • ????????}??
  • ????}??
  • }??

  • package?pool;??
  • ??
  • import?java.sql.Connection;??
  • import?java.sql.SQLException;??
  • import?java.util.Hashtable;??
  • /**?
  • ?*?連接管理類?
  • ?*?@author?Ran?
  • ?*?
  • ?*/??
  • public?class?ConnectionPoolManager?{??
  • ??????
  • ??????
  • ????//?連接池存放??
  • ????public?Hashtable<String,IConnectionPool>?pools?=?new?Hashtable<String,?IConnectionPool>();??
  • ??????
  • ????//?初始化??
  • ????private?ConnectionPoolManager(){??
  • ????????init();??
  • ????}??
  • ????//?單例實現??
  • ????public?static?ConnectionPoolManager?getInstance(){??
  • ????????return?Singtonle.instance;??
  • ????}??
  • ????private?static?class?Singtonle?{??
  • ????????private?static?ConnectionPoolManager?instance?=??new?ConnectionPoolManager();??
  • ????}??
  • ??????
  • ??????
  • ????//?初始化所有的連接池??
  • ????public?void?init(){??
  • ????????for(int?i?=0;i<DBInitInfo.beans.size();i++){??
  • ????????????DBbean?bean?=?DBInitInfo.beans.get(i);??
  • ????????????ConnectionPool?pool?=?new?ConnectionPool(bean);??
  • ????????????if(pool?!=?null){??
  • ????????????????pools.put(bean.getPoolName(),?pool);??
  • ????????????????System.out.println("Info:Init?connection?successed?->"?+bean.getPoolName());??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??????
  • ????//?獲得連接,根據連接池名字?獲得連接??
  • ????public?Connection??getConnection(String?poolName){??
  • ????????Connection?conn?=?null;??
  • ????????if(pools.size()>0?&&?pools.containsKey(poolName)){??
  • ????????????conn?=?getPool(poolName).getConnection();??
  • ????????}else{??
  • ????????????System.out.println("Error:Can't?find?this?connecion?pool?->"+poolName);??
  • ????????}??
  • ????????return?conn;??
  • ????}??
  • ??????
  • ????//?關閉,回收連接??
  • ????public?void?close(String?poolName,Connection?conn){??
  • ????????????IConnectionPool?pool?=?getPool(poolName);??
  • ????????????try?{??
  • ????????????????if(pool?!=?null){??
  • ????????????????????pool.releaseConn(conn);??
  • ????????????????}??
  • ????????????}?catch?(SQLException?e)?{??
  • ????????????????System.out.println("連接池已經銷毀");??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????}??
  • ??????
  • ????//?清空連接池??
  • ????public?void?destroy(String?poolName){??
  • ????????IConnectionPool?pool?=?getPool(poolName);??
  • ????????if(pool?!=?null){??
  • ????????????pool.destroy();??
  • ????????}??
  • ????}??
  • ??????
  • ????//?獲得連接池??
  • ????public?IConnectionPool?getPool(String?poolName){??
  • ????????IConnectionPool?pool?=?null;??
  • ????????if(pools.size()?>?0){??
  • ?????????????pool?=?pools.get(poolName);??
  • ????????}??
  • ????????return?pool;??
  • ????}??
  • }??
  • ?

  • package?pool;??
  • ??
  • import?java.util.ArrayList;??
  • import?java.util.List;??
  • /**?
  • ?*?初始化,模擬加載所有的配置文件?
  • ?*?@author?Ran?
  • ?*?
  • ?*/??
  • public?class?DBInitInfo?{??
  • ????public??static?List<DBbean>??beans?=?null;??
  • ????static{??
  • ????????beans?=?new?ArrayList<DBbean>();??
  • ????????//?這里數據?可以從xml?等配置文件進行獲取??
  • ????????//?為了測試,這里我直接寫死??
  • ????????DBbean?beanOracle?=?new?DBbean();??
  • ????????beanOracle.setDriverName("oracle.jdbc.driver.OracleDriver");??
  • ????????beanOracle.setUrl("jdbc:oracle:thin:@7MEXGLUY95W1Y56:1521:orcl");??
  • ????????beanOracle.setUserName("mmsoa");??
  • ????????beanOracle.setPassword("password1234");??
  • ??????????
  • ????????beanOracle.setMinConnections(5);??
  • ????????beanOracle.setMaxConnections(100);??
  • ??????????
  • ????????beanOracle.setPoolName("testPool");??
  • ????????beans.add(beanOracle);??
  • ????}??
  • }??
  • ?

    ? ? 測試:

  • package?pool;??
  • ??
  • import?java.sql.Connection;??
  • /**?
  • ?*?模擬線程啟動,去獲得連接?
  • ?*?@author?Ran?
  • ?*?
  • ?*/??
  • public?class?ThreadConnection?implements?Runnable{??
  • ????private?IConnectionPool?pool;??
  • ????@Override??
  • ????public?void?run()?{??
  • ????????pool?=?ConnectionPoolManager.getInstance().getPool("testPool");??
  • ????}??
  • ??????
  • ????public?Connection?getConnection(){??
  • ????????Connection?conn?=?null;??
  • ????????if(pool?!=?null?&&?pool.isActive()){??
  • ????????????conn?=?pool.getConnection();??
  • ????????}??
  • ????????return?conn;??
  • ????}??
  • ??????
  • ????public?Connection?getCurrentConnection(){??
  • ????????Connection?conn?=?null;??
  • ????????if(pool?!=?null?&&?pool.isActive()){??
  • ????????????conn?=?pool.getCurrentConnecton();??
  • ????????}??
  • ????????return?conn;??
  • ????}??
  • }??
  • ?

  • package?pool;??
  • ??
  • ??
  • ??
  • public?class?Client?{??
  • ????public?static?void?main(String[]?args)?throws?InterruptedException?{??
  • ????????//?初始化連接池??
  • ????????Thread?t?=?init();??
  • ????????t.start();??
  • ????????t.join();??
  • ??????????
  • ????????ThreadConnection?a?=?new?ThreadConnection();??
  • ????????ThreadConnection?b?=?new?ThreadConnection();??
  • ????????ThreadConnection?c?=?new?ThreadConnection();??
  • ????????Thread?t1?=?new?Thread(a);??
  • ????????Thread?t2?=?new?Thread(b);??
  • ????????Thread?t3?=?new?Thread(c);??
  • ??????????
  • ??????????
  • ????????//?設置優先級,先讓初始化執行,模擬?線程池?先啟動??
  • ????????//?這里僅僅表面控制了,因為即使t?線程先啟動,也不能保證pool?初始化完成,為了簡單模擬,這里先這樣寫了??
  • ????????t1.setPriority(10);??
  • ????????t2.setPriority(10);??
  • ????????t3.setPriority(10);??
  • ????????t1.start();??
  • ????????t2.start();??
  • ????????t3.start();??
  • ??????????
  • ????????System.out.println("線程A->?"+a.getConnection());??
  • ????????System.out.println("線程B->?"+b.getConnection());??
  • ????????System.out.println("線程C->?"+c.getConnection());??
  • ????}??
  • ??
  • ????//?初始化??
  • ????public?static?Thread?init()?{??
  • ????????Thread?t?=?new?Thread(new?Runnable()?{??
  • ????????????@Override??
  • ????????????public?void?run()?{??
  • ????????????????IConnectionPool??pool?=?initPool();??
  • ????????????????while(pool?==?null?||?!pool.isActive()){??
  • ????????????????????pool?=?initPool();??
  • ????????????????}??
  • ????????????}??
  • ????????});??
  • ????????return?t;??
  • ????}??
  • ??????
  • ????public?static?IConnectionPool?initPool(){??
  • ????????return?ConnectionPoolManager.getInstance().getPool("testPool");??
  • ????}??
  • ??
  • }??
  • ?

    小結 :

    ? ? ? ? ? 1.連接池誕生原因是,如果每次都從數據庫獲得連接,時間比較長,因此我們提前做建立一些連接,放在連接池里面,每次都從里面取

    ? ? ? ? ? 2.上面僅僅寫了連接池基本原理,關于多線程下連接池的管理沒寫,后面對多線程操作熟練了添加吧


    總結

    以上是生活随笔為你收集整理的JAVA数据库连接池实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。