package chars.pool;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import COM.ibm.db2.jdbc.app.DB2Driver;
/**
* JDK version used : jdk1.4.2_07 <br>
* Description : 涓涓暟鎹簱榪炴帴姹犵殑瀹炵幇 <br>
* Comments Name : CharsConnectionPool <br>
* author 錛歝hars <br>
* date 錛?007-06-11<br>
* Version : 1.00 <br>
*/
public class CharsConnectionPool
{
//---------------榪炴帴鏁版嵁搴撴墍闇瑕佺殑鍏冪礌---------------
private String driver;
private String url;
private String userName;
private String password;
//----------------------------------------------
private List connections = null;//榪炴帴姹犵殑瀹瑰櫒
private int intiateCount = 10;// 鍒濆鍖栬繛鎺ユ暟
private int maxCount = 100;// 榪炴帴姹犲彲浠ヤ駭鐢熺殑鏈澶ц繛鎺ユ暟
private int rateCount = 10;// 榪炴帴涓嶅鏃朵竴嬈″彲浠ョ敵璇風殑榪炴帴鏁?br>
public static int ACTIVE_ACOUNT = 0;//璁板綍鐩墠鐨勬椿鍔ㄨ繛鎺ユ暟
public String getDriver()
{
return driver;
}
public void setDriver(String driver)
{
this.driver = driver;
}
public int getIntiateCount()
{
return intiateCount;
}
public void setIntiateCount(int intiateCount)
{
this.intiateCount = intiateCount;
}
public int getMaxCount()
{
return maxCount;
}
public void setMaxCount(int maxCount)
{
this.maxCount = maxCount;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public int getRateCount()
{
return rateCount;
}
public void setRateCount(int rateCount)
{
this.rateCount = rateCount;
}
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;
}
/**
* 榪炴帴姹犳瀯閫犲嚱鏁?br> * @param driver
* @param url
* @param userName
* @param password
* @param connections
*/
public CharsConnectionPool(String driver, String url, String userName, String password)
{
super();
this.driver = driver;
this.url = url;
this.userName = userName;
this.password = password;
}
public CharsConnectionPool(Properties p)
{
super();
this.driver = p.getProperty("driver");
this.url = p.getProperty("url");
this.userName = p.getProperty("userName");
this.password = p.getProperty("password");
}
/**
* 鍒濆鍖栬繛鎺ユ睜
*
*/
public void initiatePools()throws Exception
{
if (connections != null)return;//濡傛灉榪炴帴姹犲凡緇忓緩绔嬪垯涓嶅啀嬈¤繘琛屽垵濮嬪寲
connections = new ArrayList();
initParamters();//鏍規嵁鏁版嵁搴撴敮鎸佺殑鏈澶ц繛鎺ユ暟閰嶇疆璇ヨ繛鎺ユ睜鐨勭浉鍏沖弬鏁?
for (int i = 0; i < intiateCount; i++){
connections.add(newCharsConnection());
}
}
/**
* 閿姣佽繛鎺ユ睜
* @throws Exception
*/
public void destoryPools()throws Exception
{
if (connections == null) return ;
for(int i=0; i<connections.size();i++){
CharsPoolConnection conn = (CharsPoolConnection)connections.get(i);
if(conn.isBusy()) Thread.sleep(5000);//濡傛灉璇ヨ繛鎺ユ鍦ㄤ嬌鐢ㄥ垯鍐嶇粰5縐掓椂闂?br> closeConnection(conn.getConnection());
connections.remove(conn);
}
connections = null;
}
/**
* 浠庤繛鎺ユ睜鑾峰彇榪炴帴
*
*/
public Connection getConnection()throws SQLException
{
Connection conn = null;
try{
conn = getFreeConnection();
if(conn == null) {
Thread.sleep(3000);//鏆傚仠3縐掗挓鍐嶈瘯鐫鑾峰彇榪炴帴
conn = getFreeConnection();
}
if(conn == null) {//姝ゆ椂濡傛灉榪樹笉鑳借幏寰楄繛鎺ュ垯琛ㄧず,榪炴帴姹犱腑鐨勮繛鎺ュ凡緇忕敤瀹?br> throw new SQLException("榪炴帴姹犺繛鎺ヨ繛鎺ヤ嬌鐢ㄦ灟绔?璇風◢鍚庡啀璇?!");
}
}catch(Exception e)
{
e.printStackTrace();
}
return conn;
}
/**
* 褰掕繕榪炴帴鍒拌繛鎺ユ睜(褰撹繛鎺ョ敤瀹屾椂)
* @param conn
*/
public void rebackConnection(Connection conn)
{
for(int i = 0;i < connections.size();i++){
CharsPoolConnection charsCon = (CharsPoolConnection)connections.get(i);
if(charsCon.getConnection() == conn){
charsCon.setBusy(false);
conn = null;//澶栭儴寮曠敤涓虹┖.
ACTIVE_ACOUNT --;
break;
}
}
}
// ---------------------------------------------------------------------------------------------------
/**
* 鍔犺澆椹卞姩紼嬪簭,閰嶇疆瀹為檯涓婂彲浠ョ敤鐨勬渶澶ц繛鎺ユ暟
*/
private void initParamters() throws Exception
{
int realMaxCount = -1;
Connection con = null;
try
{
Driver driver1 = new DB2Driver();
DriverManager.registerDriver(driver1);
con = DriverManager.getConnection(this.url, this.userName, this.password);
DatabaseMetaData dmd = con.getMetaData();
realMaxCount = dmd.getMaxConnections();
if(realMaxCount == 0){//濡傛灉榪斿洖鐨勫間負0,鍒欒〃紺烘渶澶х殑榪炴帴鏁頒笉鍙楅檺鍒?br> realMaxCount = 1000;//閭d箞榛樿璧嬩竴涓緝澶х殑鍊肩粰瀹?br> }
}
finally{
if(con == null) con.close();
}
if(realMaxCount < intiateCount) {//濡傛灉鏁版嵁搴撳厑璁哥殑鏈澶ф椿鍔ㄨ繛鎺ユ暟灝忎簬鍒濆鍖栫殑榪炴帴鏁?br> intiateCount = maxCount; //鍒欏疄闄呬笂鍒濆鍖栫殑榪炴帴鏁板簲璇ョ瓑浜庢暟鎹簱鍏佽鐨勬渶澶ф椿鍔ㄨ繛鎺ユ暟鎹?br> maxCount = realMaxCount;
}
else if(intiateCount < realMaxCount && maxCount >= realMaxCount){//濡傛灉鏁版嵁搴撴渶澶х殑媧誨姩榪炴帴鏁板ぇ浜庡垵濮嬪寲榪炴帴鏁頒絾鏄皬浜庤榪炴帴姹犲厑璁哥殑鏈澶ц繛鎺ユ暟
maxCount = realMaxCount; //鍒欒姹犵殑鏈澶ц繛鎺ユ暟絳変簬鏁版嵁搴撳厑璁哥殑鏈澶ф椿鍔ㄨ繛鎺ユ暟
}
}
/**
* 鑾峰彇鍙互鐢ㄧ殑榪炴帴,濡傛灉娌℃湁鏌ユ壘鍒板垯鏍規嵁鏉′歡鍦ㄦ睜涓姞鍏ユ柊鐨勮繛鎺?br> * @return
* @throws SQLException
*/
private Connection getFreeConnection()throws SQLException
{
Connection conn = null;
conn = findFreeConnection();//棣栧厛鍒拌繛鎺ユ睜涓壘絀洪棽鐨勮繛鎺?br> if(conn == null){//濡傛灉娌℃湁鎵懼埌,鍒欒瘯鐫浜х敓鏂扮殑榪炴帴鏀懼叆姹犱腑
for(int i = 1; connections.size() < maxCount && i <= rateCount;i++){//鏄惁鍐嶈兘鍦ㄨ繛鎺ユ睜涓鍔犺繛鎺ュ彇鍐充笌maxCount
connections.add(newCharsConnection());
}
conn = findFreeConnection();//鍐嶆鍦ㄨ繛鎺ユ睜涓壘
}
return conn;
}
/**
* 鍦ㄦ睜涓煡鎵懼彲浠ヤ嬌鐢ㄧ殑榪炴帴
* @return
*/
private Connection findFreeConnection()throws SQLException
{
CharsPoolConnection charsConn = null;
Connection conn = null;
for(int i = 0; i < connections.size();i++){
charsConn = (CharsPoolConnection)connections.get(i);
if(charsConn.isBusy())continue;
else {
if(!isAvalidConnection(charsConn.getConnection())) {
charsConn.setConnection(newConnection());
}
conn = charsConn.getConnection();//寰楀埌鍙互鐢ㄧ殑榪炴帴
charsConn.setBusy(true);//琛ㄦ槑涓轟嬌鐢ㄧ姸鎬?br> ACTIVE_ACOUNT++;
break;
}
}
return conn;
}
/**
* 鍒ゆ柇姹犱腑鐨勮繛鎺ユ槸鍚﹀洜涓哄叾浠栧師鍥犲彉寰椾笉鍙互鐢?br> * @param conn
* @return
*/
private boolean isAvalidConnection(Connection conn)
{
try
{
conn.setAutoCommit(true);//妯℃嫙鍔ㄤ綔,濡傛灉鑳藉鑳藉鎿嶄綔鍒欒鏄庤榪炴帴鍙敤
}catch(SQLException e)
{
closeConnection(conn);
return false;
}
return true;
}
/**
* 鍒ゆ柇涓涓繛鎺ユ槸鍚﹁繕鍙互鐢?濡傛灉涓嶅彲浠ョ敤鍒欏垱寤轟竴涓柊鐨勮繛鎺ヤ唬鏇垮畠
* @param conn
* @return
*/
private CharsPoolConnection newCharsConnection()throws SQLException
{
CharsPoolConnection charsCon = new CharsPoolConnection();
charsCon.setConnection(newConnection());
charsCon.setBusy(false);
return charsCon;
}
/**
* 鑾峰彇涓涓柊鐨勬暟鎹簱榪炴帴
* @return
* @throws SQLException
*/
private Connection newConnection()throws SQLException
{
return DriverManager.getConnection(this.url,this.userName,this.password);
}
/**
* 鍏抽棴鏁版嵁搴撹繛鎺?br> * @param conn
*/
private void closeConnection(Connection conn)
{
try
{
conn.close();
}catch(SQLException se)
{
System.out.println("鍏抽棴榪炴帴鍙戠敓寮傚父...");
}
}
}
灝佽榪炴帴姹犵殑榪炴帴:
package chars.pool;
public class CharsPoolConnection
{
private boolean isBusy;
private java.sql.Connection connection;
public java.sql.Connection getConnection()
{
return connection;
}
public void setConnection(java.sql.Connection connection)
{
this.connection = connection;
}
public boolean isBusy()
{
return isBusy;
}
public void setBusy(boolean isBusy)
{
this.isBusy = isBusy;
}
}
璋冪敤鐨勬柟寮忓ぇ鑷村彲浠ヨ繖鏍?
CharsConnectionPool pool = new CharsConnectionPool(env);
pool.initiatePools();
Connection conn= pool.getConnection(); //鑾峰彇榪炴帴
//do something with your code;
pool .rebackConnection(conn); 褰掕繕榪炴帴鍒拌繛鎺ユ睜