2

我有一个通过 Select 语句查询 Oracle 数据库的后台线程。该语句正在填充 ResultSet Java 对象。如果查询返回很多行,则 ResultSet 对象可能会变得非常大。如果它太大,我想取消后台线程,但更重要的是我想取消创建 ResultSet 对象并占用大量 Java 内存的线程。

从我目前在网上阅读的内容来看java.sql.Statement cancel(),似乎是完成这项工作的最佳方式,有人可以证实这一点吗?有没有更好的办法?

java.sql.Statement close()也可以,我可能会捕捉到 ExhaustedResultset 异常,但这可能不安全。

澄清一下,我不想要 ResultSet 或线程 - 我想从内存中完全丢弃两者。

4

3 回答 3

1

根据您的驱动程序版本,Oracle 有一个关于内存管理的精彩文档。

于 2013-07-23T15:00:37.460 回答
1

如果您确实需要查询结果,取消线程并不能解决您的问题。

如果您担心会占用太多内存,您可以在 resultSet 上设置提取大小,这将限制您一次返回的行数。然后,您将不得不在执行过程中使用 resultSet(如果数据堆积在您将 resultSet 行复制到其中的数据结构中,那么您又会吃掉内存)。

于 2013-07-23T14:08:43.737 回答
1

这取决于 JDBC 实现:Statement.cancel() 是对 JDBC 驱动程序类的请求,它可能会也可能不会满足您的需要或期望。

但是,当您执行选择(通常是非事务性的)并看到 JDBC 的默认行 Prefetch 属性为 10 时,这应该可以解决问题。有关类似/相关信息,请参阅此答案:

当我在 JDBC 应用程序中调用 PreparedStatement.cancel() 时,它实际上会在 Oracle 数据库中杀死它吗?

于 2013-07-23T13:47:54.643 回答