生活随笔
收集整理的這篇文章主要介紹了
JAVA数据库连接池实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載自? ?JAVA數據庫連接池實現
連接池的管理用了了享元模式,這里對連接池進行簡單設計。
一、設計思路
? ? ?1.連接池配置屬性DBbean:里面存放可以配置的一些屬性
? ? ?2.連接池接口IConnectionPool:里面定義一些基本的獲取連接的一些方法
? ? ?3.接口實現ConnectionPool:對上面操作進行實現,并加入一些其他方法
? ? ?4.連接池管理ConnectionPoolManager:管理所有的不同的連接池,所有的連接都能通過這里進行獲得連接
? ? ?5.另外還有幾個測試類,和連接信息模擬的類,這里就不進行xml 和配置文件信息的讀取了
package?pool;?????????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;????????????private?boolean?isCurrentConnection?=?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()?{????????????????????????????????????????????????????????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;????????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;????????public?class?DBInitInfo?{??????public??static?List<DBbean>??beans?=?null;??????static{??????????beans?=?new?ArrayList<DBbean>();??????????????????????????????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;????????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);??????????????????????????????????????????????????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数据库连接池实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。