;
帖子
3919 
精华
积分
11710 
鱼币
0 ¥ 
来自
大连 
在线时间
1858 小时 
注册时间
2007-6-11 
最后登录
2009-10-20 

贴图大师勋章新人进步勋章宣传大使勋章论坛元老勋章

3
发表于 2009-1-5 19:48 | 只看该作者
Servlet涓璲dbc搴旂敤楂樼骇绡囷紙涓夛級 - 缂栫▼搴 - Powered by SupeSite

浣犵殑浣嶇疆锛缂栫▼搴 >> 璧勮 >> JAVA棰戦亾 >> SERVLET&JSP >> 璇︾粏鍐呭 鍦ㄧ嚎鎶曠ǹ

Servlet涓璲dbc搴旂敤楂樼骇绡囷紙涓夛級

鍙戝竷: 2008-12-03 23:06 |  浣滆: 缃戠粶杞浇 |   鏉ユ簮: 缃戠粶杞浇 |  鏌ョ湅: 9娆

銆銆DBConnectionPool绫讳唬琛ㄤ竴涓敱url鏍囪瘑鐨勬暟鎹簱杩炴帴姹犮傚墠闈紝鎴戜滑宸茬粡鎻愬埌锛宩dbc鐨剈rl鐢变笁涓儴鍒嗙粍鎴愶細鍗忚鏍囪瘑锛堟绘槸 jdbc锛,瀛愬崗璁爣璇嗭紙渚嬪锛宱dbc.oracle锛,鍜屾暟鎹簱鏍囪瘑锛堣窡鐗瑰畾鐨勬暟鎹簱鏈夊叧锛夈傝繛鎺ユ睜涔熷叿鏈変竴涓悕瀛楋紝渚涘鎴风▼搴忓紩鐢ㄣ傚彟澶栵紝杩炴帴姹犺繕鏈変竴涓敤鎴峰悕锛屼竴涓瘑鐮佸拰涓涓渶澶у厑璁歌繛鎺ユ暟銆傚鏋渨eb搴旂敤鍏佽鎵鏈夌殑鐢ㄦ埛浣跨敤鏌愪簺鏁版嵁搴撴搷浣滐紝鑰屽彟涓浜涙搷浣滄槸鏈夐檺鍒剁殑锛屽垯鍙互鍒涘缓涓や釜杩炴帴姹狅紝鍏锋湁鍚屾牱鐨剈rl,涓嶅悓鐨剈ser name鍜宲assword锛屽垎鍒鐞嗕袱绫讳笉鍚岀殑鎿嶄綔鏉冮檺銆傜幇鎶奃BConnectionPool璇︾粏浠嬬粛濡備笅锛

銆銆涓銆丏BConnectionPool鐨勬瀯閫


銆銆鏋勯犲嚱鏁板彇寰椾笂杩扮殑鎵鏈夊弬鏁帮細

public DBConnectionPool(String name, String URL, String user,

String password, int maxConn) {

this.name = name;

this.URL = URL;

this.user = user;

this.password = password;

this.maxConn = maxConn;

}

銆銆灏嗘墍鏈夌殑鍙傛暟淇濆瓨鍦ㄥ疄渚嬪彉閲忎腑銆


銆銆浜屻佷粠姹犱腑鎵撳紑涓涓繛鎺


銆銆DBConnectionPool鎻愪緵涓ょ鏂规硶鏉ユ鏌ヨ繛鎺ャ備袱绉嶆柟娉曢兘杩斿洖涓涓彲鐢ㄧ殑杩炴帴锛屽鏋滄病鏈夊浣欑殑杩炴帴锛屽垯鍒涘缓涓涓柊鐨勮繛鎺ャ傚鏋滄渶澶ц繛鎺ユ暟宸茬粡杈惧埌锛岀涓涓柟娉曡繑鍥瀗ull锛岀浜屼釜鏂规硶鍒欑瓑寰呬竴涓繛鎺ヨ鍏朵粬杩涚▼閲婃斁銆

public synchronized Connection getConnection() {

Connection con = null;

if (freeConnections.size() > 0) {

// Pick the first Connection in the Vector

// to get round-robin usage

con = (Connection) freeConnections.firstElement();

freeConnections.removeElementAt(0);

try {

if (con.isClosed()) {

log("Removed bad connection from " + name);

// Try again recursively

con = getConnection();

}

}

catch (SQLException e) {

log("Removed bad connection from " + name);

// Try again recursively

con = getConnection();

}

}

else if (maxConn == 0 || checkedOut < maxConn) {

con = newConnection();

}

if (con != null) {

checkedOut++;

}

return con;

}

銆銆鎵鏈夌┖闂茬殑杩炴帴瀵硅薄淇濆瓨鍦ㄤ竴涓彨freeConnections 鐨刅ector涓傚鏋滃瓨鍦ㄨ嚦灏戜竴涓┖闂茬殑杩炴帴锛実etConnection()杩斿洖鍏朵腑绗竴涓繛鎺ャ備笅闈紝灏嗕細鐪嬪埌锛岃繘绋嬮噴鏀剧殑杩炴帴杩斿洖鍒 freeConnections鐨勬湯灏俱傝繖鏍凤紝鏈澶ч檺搴﹀湴閬垮厤浜嗘暟鎹簱鍥犱竴涓繛鎺ヤ笉娲诲姩鑰屾剰澶栧皢鍏跺叧闂殑椋庨櫓銆

銆銆鍐嶈繑鍥炲鎴蜂箣鍓嶏紝isClosed()妫鏌ヨ繛鎺ユ槸鍚︽湁鏁堛傚鏋滆繛鎺ヨ鍏抽棴浜嗭紝鎴栬呬竴涓敊璇彂鐢燂紝璇ユ柟娉曢掑綊璋冪敤鍙栧緱鍙︿竴涓繛鎺ャ

銆銆濡傛灉娌℃湁鍙敤鐨勮繛鎺ワ紝璇ユ柟娉曟鏌ユ槸鍚︽渶澶ц繛鎺ユ暟琚缃负0琛ㄧず鏃犻檺杩炴帴鏁帮紝鎴栬呰揪鍒颁簡鏈澶ц繛鎺ユ暟銆傚鏋滃彲浠ュ垱寤烘柊鐨勮繛鎺ワ紝鍒欏垱寤轰竴涓柊鐨勮繛鎺ャ傚惁鍒欙紝杩斿洖null銆

銆銆鏂规硶newConnection()鐢ㄦ潵鍒涘缓涓涓柊鐨勮繛鎺ャ傝繖鏄竴涓鏈夋柟娉曪紝鍩轰簬鐢ㄦ埛鍚嶅拰瀵嗙爜鏉ョ‘瀹氭槸鍚﹀彲浠ュ垱寤烘柊鐨勮繛鎺ャ

private Connection newConnection() {

Connection con = null;

try {

if (user == null) {

con = DriverManager.getConnection(URL);

}

else {

con = DriverManager.getConnection(URL, user, password);

}

log("Created a new connection in pool " + name);

}

catch (SQLException e) {

log(e, "Can not create a new connection for " + URL);

return null;

}

return con;

}

銆銆jdbc鐨凞riverManager鎻愪緵涓绯诲垪鐨刧etConnection锛堬級鏂规硶锛屽彲浠ヤ娇鐢╱rl鍜岀敤鎴峰悕锛屽瘑鐮佺瓑鍙傛暟鍒涘缓涓涓繛鎺ャ
銆銆绗簩涓猤etConnection()鏂规硶甯︽湁涓涓秴鏃跺弬鏁 timeout,褰撹鍙傛暟鎸囧畾鐨勬绉掓暟琛ㄧず瀹㈡埛鎰挎剰涓轰竴涓繛鎺ョ瓑寰呯殑鏃堕棿銆傝繖涓柟娉曡皟鐢ㄥ墠涓涓柟娉曘


public synchronized Connection getConnection(long timeout) {

long startTime = new Date().getTime();

Connection con;

while ((con = getConnection()) == null) {

try {

wait(timeout);

}

catch (InterruptedException e) {}

if ((new Date().getTime() - startTime) >= timeout) {

// Timeout has expired

return null;

}

}

return con;

}


銆銆灞閮ㄥ彉閲弒tartTime鍒濆鍖栧綋鍓嶇殑鏃堕棿銆備竴涓獁hile寰幆棣栧厛灏濊瘯鑾峰緱涓涓繛鎺ワ紝濡傛灉澶辫触锛寃ait()鍑芥暟琚皟鐢ㄦ潵绛夊緟闇瑕佺殑鏃堕棿銆傚悗闈細鐪嬪埌锛學ait()鍑芥暟浼氬湪鍙︿竴涓繘绋嬭皟鐢╪otify()鎴栬卬otifyAll()鏃惰繑鍥烇紝鎴栬呯瓑鍒版椂闂存祦閫濆畬姣曘備负浜嗙‘瀹歸ait()鏄洜涓轰綍绉嶅師鍥犺繑鍥烇紝鎴戜滑鐢ㄥ紑濮嬫椂闂村噺鍘诲綋鍓嶆椂闂达紝妫鏌ユ槸鍚﹀ぇ浜巘imeout銆傚鏋滅粨鏋滃ぇ浜巘imeout,杩斿洖null,鍚﹀垯锛屽湪姝よ皟鐢 getConnection()鍑芥暟銆


銆銆鍥涖佸皢涓涓繛鎺ヨ繑鍥炴睜涓


銆銆DBConnectionPool绫讳腑鏈変竴涓猣reeConnection鏂规硶浠ヨ繑鍥炵殑杩炴帴浣滀负鍙傛暟锛屽皢杩炴帴杩斿洖杩炴帴姹犮


public synchronized void freeConnection(Connection con) {

// Put the connection at the end of the Vector

freeConnections.addElement(con);

checkedOut--;

notifyAll();

}

銆銆杩炴帴琚姞鍦╢reeConnections鍚戦噺鐨勬渶鍚庯紝鍗犵敤鐨勮繛鎺ユ暟鍑1锛岃皟鐢╪otifyAll()鍑芥暟閫氱煡鍏朵粬绛夊緟鐨勫鎴风幇鍦ㄦ湁浜嗕竴涓繛鎺ャ

浜斻佸叧闂


銆銆澶у鏁皊ervlet寮曟搸鎻愪緵瀹屾暣鐨勫叧闂柟娉曘傛暟鎹簱杩炴帴姹犻渶瑕佸緱鍒伴氱煡浠ユ纭湴鍏抽棴鎵鏈夌殑杩炴帴銆侱BConnectionManager璐熻矗鍗忚皟鍏抽棴浜嬩欢锛屼絾杩炴帴鐢卞悇涓繛鎺ユ睜鑷繁璐熻矗鍏抽棴銆傛柟娉時elase()鐢盌BConnectionManager璋冪敤銆
public synchronized void release() {

Enumeration allConnections = freeConnections.elements();

while (allConnections.hasMoreElements()) {

Connection con = (Connection) allConnections.nextElement();

try {

con.close();

log("Closed connection for pool " + name);

}

catch (SQLException e) {

log(e, "Can not close connection for pool " + name);

}

}

freeConnections.removeAllElements();

}

鏈柟娉曢亶鍘唂reeConnections鍚戦噺浠ュ叧闂墍鏈夌殑杩炴帴銆
鎵撳嵃 | 鏀惰棌姝ら〉 |  鎺ㄨ崘缁欏ソ鍙 | 涓炬姤
涓婁竴绡 涓嬩竴绡
 

璇勫垎锛0

鍙戣〃璇勮
鏌ョ湅鍏ㄩ儴鍥炲銆愬凡鏈0浣嶇綉鍙嬪彂琛ㄤ簡鐪嬫硶銆