当前位置: 首页 > 知识库问答 >
问题:

在 JDBC 中关闭结果集后的内存/堆状态

司空思聪
2023-03-14
  1. 结果集从数据库获取记录。
  2. 使用结果集对象后,我们最终关闭结果集。

问题是,一旦rs.close()被调用,它会从内存中释放删除获取的记录吗?或者当JVM面临空间不足时,会调用garabage collector删除resultSet?

如果JVM在面临内存不足时调用GC,那么在java程序中手动调用垃圾收集器以释放空间是一种好的做法吗?

共有3个答案

令狐烨烨
2023-03-14

显式GC是JVM的负担,因为它必须经常检查内存使用情况并决定何时触发它。在哪里,根据应用程序要求设置适当的GC就足以处理上述场景。

ResultSet.close会将资源标记为垃圾收集,即释放引用以将内存块标记为不可到达。此外,对于jdbc,需要关闭连接,这样保存连接缓存的内存也可以标记为gc。

袁安志
2023-03-14

ResultSet.close()将立即释放所有资源,Blob、Clob和NClob对象除外。释放意味着当垃圾收集器决定这样做时,资源将被释放。通常我们不用担心这个问题。

但是,JDBC使用的一些内存可能仍在使用。假设驱动程序内置了某种缓存,并且该缓存是连接范围的。要释放内存,你必须关闭JDBC连接。

例如,MySQL JDBC的默认读取大小为0,这意味着它会将整个表加载到内存中,并在内存中保存所有语句。这个内存缓冲区的范围是什么?;)

无论如何,如果您怀疑内存问题,请查看您的JDBC驱动程序细节。

经验法则,显式GC从来都不是好主意。但是要快速查看以确定ResultSet.close()/Connection.close()是否释放任何资源,请尝试一下:检查已使用/释放内存,关闭(),gc(),再次检查内存。没有显式GC,您几乎看不到任何更改。

祁彬
2023-03-14

结果集通常通过使用数据库游标实现。调用 resultSet.close() 将释放该游标,因此它将立即释放数据库中的资源。

结果集读取的数据通常以记录块的形式接收。调用<code>结果集。close()可能会“释放”最后一个块,使其符合GC的条件,但一旦<code>结果集后立即发生,因此,调用<code>close()</code>是否提前释放Java内存并不重要。

Java内存仅通过GC运行释放。您无法控制何时发生这种情况(调用<code>System.gc()

你考虑错了。您应该关注的是:

> < li>

确保resources1总是尽快关闭,以释放数据库和系统资源。

这最好使用try with资源来完成。

确保不要保留太多数据,例如,如果您可以在获得数据时处理数据,则不要为检索到的每一行创建对象。

这通常发生在内存泄漏时,而不是在JDBC驱动程序中。

1)例如。ResultSet语句连接InputStreamOutputStreamReaderWriter等。

 类似资料:
  • 单击按钮时,此代码显示此错误消息: 结果集关闭后不允许操作 代码:

  • 问题内容: 尽管随后关闭了连接,是否必须分别关闭JDBC结果集和语句?据说在使用后关闭所有JDBC资源是一个好习惯。但是,如果我有以下代码,是否有必要关闭结果集和语句? 问题是连接的关闭是否可以完成任务,或者它是否使某些资源处于使用状态。 问题答案: 你所做的是完美且非常好的做法。 我说这是一个好的做法的原因……例如,如果由于某种原因你正在使用“原始”类型的数据库池并调用,则连接将返回到池中,并且

  • 我已经为此工作了将近一天半,我似乎无法解决这个错误。我不知道为什么结果集被关闭。也许你们中的一些人可以帮我。 MySQL数据库: MySQLHandler MySQLDonation 异常发生在这里:在MySQLDonation和实际堆栈跟踪的同时循环中: 有了这些信息,让我说这确实有效,我得到了我的信息和游戏中没有的东西,但它会重复,就像用户永远不会从查询中删除,所以它会给他们无限的奖励。如果您

  • 以下网站展示了如何在JDBC中使用新的“自动关闭”功能:link。该网站显示了语句将如何自动关闭,但结果集不在try()部分,在那里它将自动关闭。所以,我的问题是,我不需要在Java 7中直接关闭结果集吗?我一直使用这种模式:关闭结果集、关闭语句、关闭连接。

  • 在这个oracle java教程中,它说: TYPE_FORWARD_ONLY:结果集不能滚动;其光标仅向前移动,从第一行之前移动到最后一行之后。结果集中包含的行取决于基础数据库如何生成结果。也就是说,它包含在执行查询时或在检索行时满足查询的行。 “结果集中包含的行取决于基础数据库生成结果的方式。 查询执行时间和行检索时间有什么区别?我如何知道我的数据库支持哪些?提前致谢。

  • 主要内容:ResultSet类型,ResultSet的并发性,浏览结果集,查看结果集,更新结果集SQL语句执行后从数据库查询读取数据,返回的数据放在结果集中。 语句用于从数据库中选择行并在结果集中查看它们的标准方法。 接口表示数据库查询的结果集。 对象维护指向结果集中当前行的游标。 术语“结果集”是指包含在对象中的行和列数据。 接口的方法可以分为三类: 浏览方法:用于移动光标。 获取方法:用于查看光标指向的当前行的列中的数据。 更新方法:用于更新当前行的列中的数据。 然后在基础数据库中更新数