物件的數量 與 連線池連線數量的問題,困擾已久。

Juniper發表於2004-07-14
開發環境:win2000 server + j2sdk1.4 + Tomcat5.019 + SQLServer2000

系統概況:
*系統中用到了jsp,Servlet,Tag簡單標籤,javaBean,通用類。
*在Tomcat中配置了一連線池,最大連線數(maxActive)限定為3個,(主要是為了方便測試)空閒時最少保持連線數(maxIdle)為1個。
*寫了一個連線資料庫的類,負責與資料庫建立連線並返回Connection。除了產生連線的方法,還有一個關閉連線方法,程式碼如下:
package Panabia.db;

import javax.sql.DataSource;
import javax.naming.*;
import java.sql.*;
public class conFactory
{
private static DataSource ds=null;
private Connection con=null;

public Connection gainCon() throws NamingException,SQLException
{
if(ds==null){
synchronized(this){
if(ds==null){
Context ctx=new InitialContext();
ds=(DataSource)ctx.lookup("java:comp/env/jdbc/Panabia");
}
}
}
con=ds.getConnection();
return con;
}

public void release() throws SQLException
{ if(con!=null&&!con.isClosed()) con.close(); }
}

問題是:
在測試的時候,如果在jsp中以javaBean的形式(<jsp:useBean id="db" class="Panabia.db.conFactory" scope="session"/>)使用conFactory,連線池工作穩定,一切都很正常;空閒時連線池中的個數保持為1,最高不過3(其實也過不了3)。

但如果將這個類匯入到 JSP標籤 中使用時,同時SQL連線數竟然達到了5個?!但是資料庫連線池最大的同時連線數被限定到 3 個,為什麼能達到5個呢------更怪的是,這5個連線會一直處於 ESTABLISHED 狀態,不會被釋放掉。

而單獨使用 javaBean 測試,最大SQL連線達到3的時候,空閒一段時間,2個連線就會被釋放,只留下1個保持連線。

在JSP標籤中引用連線類程式碼(片段):
package Panabia.tags;

import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.IOException;
import java.sql.*;
import javax.naming.NamingException;
import Panabia.db.conFactory; //匯入連線類

public class add_company extends TagSupport{

public int doStartTag() throws JspException{

Connection con=null;
conFactory cfy=new conFactory(); //生成連線類例項 cfy
............
........
con=cfy.gainCon(); //獲取連線
................
.......(略)}

*我懷疑Tomcat是不是開了 5 個連線池?
因為用到的 JSP標籤 比較多,在每個標籤內都是象上面那樣生成 conFactory的物件 cfy,然後獲取SQL連線;
每個標籤生成一個cfy,那n個標籤不是就生成了n個conFactory物件?
每個物件一個連線池,所以,就出現了上面所說的同時開了5個連線的現象----

----不知這樣認為對否?

但使用 javaBean時不會出現這種現象,我想,應該是 scope="session" 的緣故,jsp會自動在每個JSP頁面中共享同一個 conFactory物件,而

在 JSP標籤 裡是每個 標籤 生成一個物件,於是......??

----這個問題如何解決呢?小弟弟剛剛入門,對“物件緩衝池”之類的東東還不是特別明白,還請各位DX指條明路!


相關文章