开发环境: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指条明路!