您的位置:首页 > 编程语言 > Java开发

java.sql.SQLRecoverableException: IO 错误: Broken pipe

2013-12-19 14:38 441 查看
这个是连接池里面的链接都是长连接,一直保持与数据库的链接。我用的是Oracle数据库。出于某种原因,Oracle数据库会把很长时间的链接kill掉。这样,连接池里面的长连接,并不知道自身在服务器端已经被kill了,再次发生向数据库的请求连接时,发生上面的异常。

没有办法,我只能写了个方法,来解决这个问题:代码如下:
/**
* <pre>
* Date:2011-12-29
* 防止发生异常:nested exception is java.sql.SQLRecoverableException: IO Error: Broken pipe
* 原因:连接池链接一段时间之后,会被oracle在服务器端中断,而连接池并不知道自己的链接被中断,照旧进行连接操作,发生异常
* @param dataSource
* @param oldConn
* @return
* @throws SQLException
* </pre>
*/
private static Connection getValidConnection(DataSource dataSource,Connection oldConn) throws SQLException {
//get the connection from the datasource
Connection conn = oldConn;
int commonTimeout = 150;

//check the connection, if the connection is not suitable, then get the new connection and check it again
while(null == conn || conn.isClosed() || !conn.isValid(commonTimeout)) {
try {
if(null != conn && !conn.isClosed()) {
//close the connection
conn.close();
}
} catch (SQLException e) {
logger.error("Can not close connection :\t"+e.getMessage(),e);
}
//get the new connection
conn = dataSource.getConnection();
}

//return the valid connection
return conn;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐