杀死从Oracle DB填充Java ResultSet对象的线程的最佳方法

时间:2013-07-23 13:41:46

标签: oracle

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

从我到目前为止在线阅读java.sql.Statement cancel(),似乎是完成这项工作的最佳方法,有人能证实这一点吗?有更好的方法吗?

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

为了澄清,我不想要ResultSet或线程 - 我想完全丢弃内存。

3 个答案:

答案 0 :(得分:1)

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

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

When I call PreparedStatement.cancel() in a JDBC application, does it actually kill it in an Oracle database?

答案 1 :(得分:1)

如果您确实需要查询结果,则取消该线程无法解决您的问题。

如果您担心耗尽太多内存,可以在resultSet上设置fetch size,这将限制您一次返回的行数。然后你必须随意使用resultSet(如果数据堆积在你正在复制resultSet行的数据结构中,那么你就会回到吃掉内存)。

答案 2 :(得分:1)

Oracle在内存管理方面有great document,具体取决于您的驱动程序版本。