Posted on 2006-11-26 13:23
帥子 閱讀(1754)
評論(0) 編輯 收藏 所屬分類:
J2EE技術(shù)專區(qū)
連接池最基本的目的:?
1、重用連接,節(jié)省連接資源;?
2、免去建立連接操作,提高效率
3.?限制最大連接并發(fā)數(shù)
自己弄的一個(gè)連接池,絕對高效安全,支持多數(shù)據(jù)源
連接池的兩種實(shí)現(xiàn)方式:
1.?修飾模式弄個(gè)ConnectionWrapper類出來?
2.?動態(tài)代理
這里采用的是第一種方式
ConnectionAdapter??implements?Connetion
ConnectionWrapper?extends?ConnectionAdapter?
ConnectionWrapper?中封裝了connection對象
close方法重寫為
{
?SimpleConnectionPool.putConnectionToPool(this);
?//把連接返回連接池
}
配置文件?app.properties
ConnectionAdapter?從DBCP拷貝過來,刪了些垃圾東西
支持多數(shù)據(jù)源
DBUtil.getConn();//獲取默認(rèn)連接池
DBUtil.getConn(pool_name);//獲取指定名稱的連接池
各參數(shù)說明
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?//數(shù)據(jù)庫類型
pool=1????????//是否使用連接池?1?使用
max_wait=3????//連接池已滿時(shí),最大等待時(shí)間?,單位?s
#timeout?,wait?time?when?max?active?,??unit?s
max_active=20??//最大活動連接數(shù),用這個(gè)來控制最大并發(fā)數(shù)
min_free=3?????//連接池中最小空閑連接數(shù)
max_free=20????//連接池中最大空閑連接數(shù),默認(rèn)=max_active
check_sql=select?getdate()??//驗(yàn)證連接是否有效,
clear_time=2????????????????//清理空閑連接
#clear_time,remove?the?old?connection,unit?min
還可以用動態(tài)代理的方式實(shí)現(xiàn)連接池
2.
動態(tài)代理實(shí)現(xiàn)
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;
??}
??
}
??????????????代碼不全,只提供連接池部分代碼,學(xué)習(xí)交流用