2017-10-21 86 views
0

对于JDBC连接,我知道Java将创建一个带有端口号的开放式套接字,并且在它与数据库服务器之间建立一个开放式连接,并具有指定的端口号,数据库名称也许还有其他的选择,关闭这个资源显然是需要的。声明对象拥有什么资源

但是对于Statement,与ResultSet一起,他们拥有的资源是什么,所以我们需要关闭它们?我的意思是技术上的。

+0

对于ResultSet,它是数据库游标。基本上,数据库并不总是急切地检索所有结果 - 相反,它会保留对结果本身的引用的临时索引并按需检索它们。关闭“ResultSet”时资源将被释放。 对于'PreparedStatement'(通常不适用于普通的'Statement'),在服务器上准备好的语句。 –

+1

@PiotrWilkin为什么使用评论回答?你可以发布这个作为一个真正的答案。 –

回答

1

资源是否实际由语句或结果集持​​有,很大程度上取决于特定的数据库和驱动程序。

Java中的一个Statement可能在数据库中有一个对应(语句句柄),一些语句的内存,超时,读取大小,缓冲区等配置。对于普通的Statement,情况并非总是如此,但对于PreparedStatement数据库中的语句句柄通常会保存编译语句的版本及其执行计划等。

在Java中关闭语句对象将在数据库中释放此句柄(或者可能释放它以供重用不同的语句),并且可能例如释放对元数据的“存在锁定”(例如,防止表在被使用/准备时被丢弃)。另外,在Java中关闭语句将关闭所有打开的结果集,然后可以释放Java和数据库中的内存。

关闭结果集本身也有明显的好处,结果集可能会保存Java中的内存(例如预取行,有时是完整结果),因此关闭结果集将释放预取行和空闲内存。如果您尚未完全读取结果集,或者您正在使用可滚动结果集,则这尤其适用。

结果集还可能在数据库端有一个指向最后一行的数据库的游标(或类似的数据库),锁定行(例如在for update select语句中),也可能包含一些预定义的在内存中获取行。关闭结果集将释放内存和任何锁等。

换句话说:是的,你应该关闭结果集和语句,你应该尽快完成它们。