再讨论:连接池的问题 就用try包括,等异常时查看错误信息不就可以了吗 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果正常连接数据库的话,conn.isClosed()不会不起作用啊 用try出来的是your session hase been killed 杀了连接的进程,connection应该是非法关闭,当然后面的操作会出错你如果try到了这个异常,然后在catch里面response.sendRedirect("/error.htm");return;而不通过conn==null来判断,这样不也达到了同一效果了吗 首先你想想一个连接是从连接池中获得的,你要判断他的状态当然是去该连接池的管理处查询。其次连接在数据库端被kill,则这个连接对象就已经失效了,你又怎么能通过自身的属性方法去判断呢,这好比让一个死人去对别人说他是死的还是活的。 我的连接池是通过conn.isClosed()来判断的,可是我发现碰到这种情况,它不生效呀 kill掉连接,估计连接池破坏,conn.isClosed()就会抛出异常,不生效的原因之一 try { if(conn.isClosed()) { log("delete a connection from pool"); conn = getConnection(); } } catch(SQLException sqlException) { conn = getConnection(); log("error in delete a connection from pool",sqlException); }上面的代码应该没问题吧,它怎么不递归,还是返回一个错误的conn 什么叫不递归?这个哪用到递归了,按道理在catch里重建了连接,然后打出一条日志,后面的程序应该继续执行,你说返回错误,是在哪返回,是在后面用conn的时候吗?不明白你什么意思 对了,还有你在try里没有执行SQL的操作,但你的catch捕获的是SQLException,这肯定抓不到的。改成Exception应该可以,再试试 public synchronized Connection getConnection() { Connection conn = null; if(freeConn.size() > 0) { conn = (Connection)freeConn.firstElement(); freeConn.removeElementAt(0); try { if(conn.isClosed()) { log("delete a connection from pool"); conn = getConnection(); } } catch(SQLException sqlException) { log("error in delete a connection from pool",sqlException); conn = getConnection(); } } else if(client < maxConn) { conn = this.newConnection(); } if(conn != null) { client++; } //log(freeConn.size()+" "+client+" "+maxConn); return conn; }这里不是递归吗?conn.isClosed()抛出的是SQLException.API中 boolean isClosed() throws SQLException;就是这样的呀. 哦,这样,程序看起来好象没问题,API中说if a database access error occurs,就会抛出SQLException,我想会不会是conn = (Connection)freeConn.firstElement();这个有问题,freeConn.......思考中 前面有freeConn.addElement(conn);后面才,conn = (Connection)freeConn.firstElement();可有时候取出来的conn是无效的,不好判断呀 有一个办法就取出连接后试着从dual表中执行一条SQL(select * from dual)然后捕捉异常来判断,这样的话我用连接池了来提高速度的算盘也就落空了 实际运用中好似conn.isClosed()真的不起作用的,只要你没有用conn.close(),conn.isClosed()总会为false.一个方法是另写一个public boolean isClosed(){ try{ Statement stmt=conn.createStatement(); stmt.close(); return false; }catch(Exception e){ return true; }}请各位指教. Jfreechart中的饼图的文字连接线怎么设置成直线 求助VML怎么画动态矢量图? 我想问问怎么插入源代码啊 JSF标签问题 简单的页面调用APPLET问题 JSP调用exe文件 页面输出的问题,请大家帮忙! Web应用选择JavaBean和EJB的理由分别是什么? javabean的问题!急! jsp文件为什么出错了?(和javabean有关) 如何使这个函数每隔一定时间运行? JSP两问
your session hase been killed
你如果try到了这个异常,然后在catch里面response.sendRedirect("/error.htm");return;而不通过conn==null来判断,这样不也达到了同一效果了吗
其次连接在数据库端被kill,则这个连接对象就已经失效了,你又怎么能通过自身的属性方法去判断呢,这好比让一个死人去对别人说他是死的还是活的。
它不生效呀
{
if(conn.isClosed())
{
log("delete a connection from pool");
conn = getConnection();
}
}
catch(SQLException sqlException)
{
conn = getConnection();
log("error in delete a connection from pool",sqlException);
}
上面的代码应该没问题吧,
它怎么不递归,还是返回一个错误的conn
{
Connection conn = null;
if(freeConn.size() > 0)
{
conn = (Connection)freeConn.firstElement();
freeConn.removeElementAt(0);
try
{
if(conn.isClosed())
{
log("delete a connection from pool");
conn = getConnection();
}
}
catch(SQLException sqlException)
{
log("error in delete a connection from pool",sqlException);
conn = getConnection();
}
}
else if(client < maxConn)
{
conn = this.newConnection();
}
if(conn != null)
{
client++;
}
//log(freeConn.size()+" "+client+" "+maxConn);
return conn;
}这里不是递归吗?conn.isClosed()抛出的是SQLException.
API中 boolean isClosed() throws SQLException;
就是这样的呀.
后面才,conn = (Connection)freeConn.firstElement();
可有时候取出来的conn是无效的,不好判断呀
然后捕捉异常来判断,这样的话我用连接池了来提高速度的算盘也就落空了
一个方法是另写一个
public boolean isClosed(){
try{
Statement stmt=conn.createStatement();
stmt.close();
return false;
}catch(Exception e){
return true;
}
}
请各位指教.