PreparedStatement、ResultSet和Connection关闭问题

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

14 个解决方案

#1


分少没人来吗  ~~~~(>_<)~~~~ 

#2


关闭是节省资源。最好是按顺序关掉

#3


打开顺序:
Connection
PreparedStatement
Result

关闭顺序:
Result
PreparedStatement
Connection

PS:我认为其实关闭的时候直接关闭Connection也就行了,没事。( 欢迎对这个结论拍砖

#4


只要关闭connection,其他的都会被关闭

当然如果你在循环里用同一个connection查询处理多个结果集,那么你可能需要考虑在用完每个结果集后关闭它们

#5


但是最好按照以下顺序关闭: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的

#6


四哥V5

#7


最好还是按照Result,PreparedStatement,Connection顺序进行关闭

#8


四楼说得很详细,学习了

#9


分少有人来的!

#10


五楼的说的很明白,关闭最好按顺序来,resultset preparedstatement,connection按这个顺序关闭

#11


按要求关闭吧,我用过 Sybase 的驱动,没自己关闭 ResultSet 和 Statement 的时候还是导致连接被用尽,可能 JDBC 2.0 和 3.0 在细节上还是有点差别,我们最好是把自己应该做的事情自己做了,而不要指望自动去做,不同的实现版本可能细节不同,依赖实现细节的代码会碰到移植性的问题,而且很难查觉错误在哪里。

#12


五楼的说的很明白,关闭最好按顺序来,resultset preparedstatement,connection按这个顺序关闭 

#13


五楼的说的很明白,关闭最好按顺序来,resultset preparedstatement,connection按这个顺序关闭 

#14


五楼的说的很明白,关闭最好按顺序来,resultset preparedstatement,connection按这个顺序关闭 

#1


分少没人来吗  ~~~~(>_<)~~~~ 

#2


关闭是节省资源。最好是按顺序关掉

#3


打开顺序:
Connection
PreparedStatement
Result

关闭顺序:
Result
PreparedStatement
Connection

PS:我认为其实关闭的时候直接关闭Connection也就行了,没事。( 欢迎对这个结论拍砖

#4


只要关闭connection,其他的都会被关闭

当然如果你在循环里用同一个connection查询处理多个结果集,那么你可能需要考虑在用完每个结果集后关闭它们

#5


但是最好按照以下顺序关闭: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的

#6


四哥V5

#7


最好还是按照Result,PreparedStatement,Connection顺序进行关闭

#8


四楼说得很详细,学习了

#9


分少有人来的!

#10


五楼的说的很明白,关闭最好按顺序来,resultset preparedstatement,connection按这个顺序关闭

#11


按要求关闭吧,我用过 Sybase 的驱动,没自己关闭 ResultSet 和 Statement 的时候还是导致连接被用尽,可能 JDBC 2.0 和 3.0 在细节上还是有点差别,我们最好是把自己应该做的事情自己做了,而不要指望自动去做,不同的实现版本可能细节不同,依赖实现细节的代码会碰到移植性的问题,而且很难查觉错误在哪里。

#12


五楼的说的很明白,关闭最好按顺序来,resultset preparedstatement,connection按这个顺序关闭 

#13


五楼的说的很明白,关闭最好按顺序来,resultset preparedstatement,connection按这个顺序关闭 

#14


五楼的说的很明白,关闭最好按顺序来,resultset preparedstatement,connection按这个顺序关闭