当前位置: 技术问答>java相关
再讨论:连接池的问题
来源: 互联网 发布时间:2015-10-23
本文导语: Connection conn; conn = (Connection)freeConn.firstElement(); 如何检查conn这个连接的有效性? if (conn==null){response.sendRedirect("/error.htm");return;} Statement stmt = conn.createStatement(); 以上的代码在一般情况下是正常的, 可是如果ORAC...
Connection conn;
conn = (Connection)freeConn.firstElement();
如何检查conn这个连接的有效性?
if (conn==null){response.sendRedirect("/error.htm");return;}
Statement stmt = conn.createStatement();
以上的代码在一般情况下是正常的,
可是如果ORACLE中用alter system kill session'108,3723';
杀了连接后,它会报错。
那么怎么样在Statement stmt = conn.createStatement();
之前检查conn的状态呢?
conn.isClosed()
好象不起作用哟
conn = (Connection)freeConn.firstElement();
如何检查conn这个连接的有效性?
if (conn==null){response.sendRedirect("/error.htm");return;}
Statement stmt = conn.createStatement();
以上的代码在一般情况下是正常的,
可是如果ORACLE中用alter system kill session'108,3723';
杀了连接后,它会报错。
那么怎么样在Statement stmt = conn.createStatement();
之前检查conn的状态呢?
conn.isClosed()
好象不起作用哟
|
就用try包括,等异常时查看错误信息不就可以了吗
|
如果正常连接数据库的话,conn.isClosed()不会不起作用啊
|
杀了连接的进程,connection应该是非法关闭,当然后面的操作会出错
你如果try到了这个异常,然后在catch里面response.sendRedirect("/error.htm");return;而不通过conn==null来判断,这样不也达到了同一效果了吗
你如果try到了这个异常,然后在catch里面response.sendRedirect("/error.htm");return;而不通过conn==null来判断,这样不也达到了同一效果了吗
|
首先你想想一个连接是从连接池中获得的,你要判断他的状态当然是去该连接池的管理处查询。
其次连接在数据库端被kill,则这个连接对象就已经失效了,你又怎么能通过自身的属性方法去判断呢,这好比让一个死人去对别人说他是死的还是活的。
其次连接在数据库端被kill,则这个连接对象就已经失效了,你又怎么能通过自身的属性方法去判断呢,这好比让一个死人去对别人说他是死的还是活的。
|
kill掉连接,估计连接池破坏,conn.isClosed()就会抛出异常,不生效的原因之一
|
什么叫不递归?这个哪用到递归了,按道理在catch里重建了连接,然后打出一条日志,后面的程序应该继续执行,你说返回错误,是在哪返回,是在后面用conn的时候吗?不明白你什么意思
|
我还是觉得你最好通过连接池的管理器去判断一个连接是否有效,
至于上面的代码对不对,这个和你那个连接池的管理机制有关系的
但我个人认为你没有手动地销毁这个连接对象,在你的池管理那还是没有释放这部分内存空间的。
至于上面的代码对不对,这个和你那个连接池的管理机制有关系的
但我个人认为你没有手动地销毁这个连接对象,在你的池管理那还是没有释放这部分内存空间的。
|
对了,还有你在try里没有执行SQL的操作,但你的catch捕获的是SQLException,这肯定抓不到的。改成Exception应该可以,再试试
|
哦,这样,程序看起来好象没问题,API中说if a database access error occurs,就会抛出SQLException,我想会不会是conn = (Connection)freeConn.firstElement();这个有问题,freeConn.......思考中
|
真搞不懂,把取个连接 的方法弄得这么复杂,你写什么程序呢
|
有一个办法就取出连接后试着从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;
}
}
请各位指教.
一个方法是另写一个
public boolean isClosed(){
try{
Statement stmt=conn.createStatement();
stmt.close();
return false;
}catch(Exception e){
return true;
}
}
请各位指教.
|
good