对于JDBC连接,我知道Java将创建一个带有端口号的套接字,并在它与DB服务器之间打开连接,并指定端口号,数据库名称和其他选项,关闭此资源显然需要的。
但对于Statement
,与ResultSet
一起,他们拥有的资源是什么,所以我们需要关闭它们?我的意思是技术上。
答案 0 :(得分:1)
资源是否实际由语句或结果集保存,在很大程度上取决于特定的数据库和驱动程序。
Java中的Statement
可以在数据库中具有对应的(语句句柄),其中包含一些语句内存,超时配置,提取大小,缓冲区等。对于普通Statement
这个情况并非总是如此,但对于PreparedStatement
,数据库中的语句句柄通常会包含已编译语句的版本及其执行计划等。
在Java中关闭语句对象将在数据库中释放此句柄(或者可以将其释放以供不同语句重用),并且可能例如在元数据上释放“存在锁”(例如,防止表被丢弃)仍在使用/准备)。此外,在Java中关闭语句将关闭所有打开的结果集,然后可以释放Java和数据库中的内存。
关闭结果集本身也有明显的好处,结果集可能在Java中保存内存(例如预取的行,有时是完整的结果),因此关闭结果集将释放那些预取的行和空闲内存。如果您尚未完全读取结果集,或者您正在使用可滚动的结果集,则尤其适用。
结果集也可能在数据库端有一个游标(或类似的),它指向最后一行提取,锁定行(例如在for update
select语句中),也许它还包含一个数字内存中的预取行。关闭结果集将释放内存和任何锁等
换句话说:是的,你应该关闭结果集和语句,一旦你完成它们就应该这样做。