如果ResultSet取值并存入内存,为啥ResultSet对象关闭后就不能使用了?

Posted

技术标签:

【中文标题】如果ResultSet取值并存入内存,为啥ResultSet对象关闭后就不能使用了?【英文标题】:If the ResultSet fetches and stores the value in memory, why ResultSet objects cannot be used after closing it?如果ResultSet取值并存入内存,为什么ResultSet对象关闭后就不能使用了? 【发布时间】:2019-03-08 09:12:18 【问题描述】:

我是 JDBC 新手,我正在使用 mysql JDBC 驱动程序,但我不明白结果集是如何工作的。

The JDBC API Implementation notes说

默认情况下,ResultSet 被完全检索并存储在内存中。在大多数情况下,这是最有效的操作方式,并且由于 MySQL 网络协议的设计,更容易实现。

如果结果集对象获取数据并存储在内存中,那么为什么关闭它后仍然无法访问该对象,因为它仍在内存中?

调用 close() 方法会切断对数据的引用吗?如果有怎么做?

帮帮我。

【问题讨论】:

【参考方案1】:

如果结果集对象获取数据并存储在内存中,那么为什么关闭它后仍然无法访问该对象,因为它仍在内存中?

因为这就是 JDBC API specification 所说的应该发生的事情:

" void close() throws SQLException

立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待它自动关闭时发生。"


调用 close() 方法会切断对数据的引用吗?

实际上是的。


如果有,怎么做?

看了一眼,感觉很复杂。如果您真的想知道,请阅读源代码。它在 GitHub 上:

https://github.com/mysql/mysql-connector-j

....我不明白结果集是如何工作的。

您无需需要了解这一点即可使用 JDBC。您只需要了解应该如何使用 ResultSet ... 和相关类。 JDBC javadocs 解释了

【讨论】:

以上是关于如果ResultSet取值并存入内存,为啥ResultSet对象关闭后就不能使用了?的主要内容,如果未能解决你的问题,请参考以下文章

查找 ResultSet 列数? [复制]

如果没有明确关闭 ResultSet 会泄漏吗?

java:把查询结果存储到resultSet对象中,在把该对象的数据放置在一个JTable对象中

在ResultSet.execute之后循环终止[重复]

选取10-100之间的10个数字,存入一个数组,并排序

在c语言中&std是啥意思