【问题标题】:best way to kill thread that populates Java ResultSet object from Oracle DB杀死从 Oracle DB 填充 Java ResultSet 对象的线程的最佳方法
【发布时间】:2013-07-24 10:16:56
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: oracle


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多