试用了一下Tomcat7的新连接池,写一个用于相同线程间Dao对象共享连接的Filter时候遇到了一个比较奇怪的问题。总是过滤器在响应最后关闭connection时抛出异常:
java.sql.SQLException: Connection has already been closed.
主要代码如下
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
// 请求响应
chain.doFilter(request, response);
} finally { // 请求响应结束后关闭数据库连接
try {
close();
} catch (SQLException e) {
log.warn("SQLException: " + e.getMessage());
}
}
}
/**
* 关闭并从ThreadLocal中清除和当前线程绑定的数据库连接
*
* @throws SQLException
*/
public static void close() throws SQLException {
Connection connection = connectionThreadLocal.get();
if (connection != null) { // 如果存在数据库连接 就关闭并清除
try {
log.debug(connection.isClosed());
connection.close();
} finally {
connectionThreadLocal.remove();
log.debug("connection(" + connection.hashCode() + ") close");
}
}
}
试过应用自己创建DataSource和直接用Tomcat的数据源配置创建都有同样的问题。而且在调用connection的close()之前log.debug(connection.isClosed());输出都是false。不知道各位有没有遇到这个情况,知道原因的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。