一般在数据库操作的时候,都会涉及连接的关闭问题。
如果关闭不了,服务器会越来越慢,最好挂掉。如果是数据库连接池的时候可以配置输出log。
tomcat的context.xml设定例子:
<Resource name="jdbc/postgres" auth="Container"
type="javax.sql.DataSource"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/myDB"
username="postgres" password="postgres"
maxActive="20" maxIdle="10" maxWait="-1"
removeAbandoned="true" removeAbandonedTimeout="300" logAbandoned="true"
/>
在出现没有关闭的情况下,会输入错误信息。根据提示的class就可以找到错误的地方了。
下面是一种比较不好的写法。
// 取得连接
Connection con = null;
try {
ds = (DataSource)(new InitialContext.lookup("....");
con = ds.getConnection();
} catch (NamingException e){
//错误处理1
……
} catch (SQLException e){
//错误处理2
……
}
//事务处理
……
// 关闭连接
try {
con.close();
} catch (SQLException e) {
// 错误处理
……
}
这种写法findbug都不能发现问题。如果不仔细查看也不一定能发现问题。确实有了关闭的动作。
但是仔细分析就会发现,这种写法是比较要命的。如果在关闭之前就异常了,那这个链接就没法被关闭了。
一般代表性的写法如下:
Connection con = null;
try {
ds = (DataSource)(new InitialContext.lookup("....");
con = ds.getConnection();
//事务处理
…
} catch (NamingException e){
// 错误处理
……
} catch (SQLException e){
// 错误处理
……
} finally {
if (con!=null) {
con.close();
}
}