日期:2014-05-17  浏览次数:21064 次

PreparedStatement、ResultSet和Connection关闭问题
我看到一段代码 :PreparedStatement、ResultSet和Connection。打开顺序是Connection、ResultSet 、PreparedStatement,用的是jdbc连接( JDBCDataSource.getJDBCDataSource("jdbc.informix").getConnection();)先关闭ResultSet,再关闭PreparedStatement,不关闭ResultSet,这样会不会有问题。

------解决方案--------------------
只要关闭connection,其他的都会被关闭

当然如果你在循环里用同一个connection查询处理多个结果集,那么你可能需要考虑在用完每个结果集后关闭它们
------解决方案--------------------
但是最好按照以下顺序关闭:rs(同一个连接有多个rs在每个就用完之后就立即close),stmt(同rs),conn


原因如下:
The JDBC spec requires that a Connection close any open Statement's when it is closed

JDBC规范要求关闭连接的时候同时关闭任何与其关联的打开的Statement

一般情况下关闭close都没问题

但是,如果碰到一个不负责任的数据库连接池就不好说了

连接池重写了Connection了close方法,当调用这个方法时不关闭底层连接,而是将连接放回池中。一个负责任的连接池都应该在此时将rs和stmt物理关闭,不负责任的就可能没有将rs和stmt关闭,直接将conn丢回池中,最终可能导致OutOfMemory

在dbcp中重写的close方法里就passivate这样一个方法调用,就是用来关闭rs和stmt的