【问题标题】:SQL Statement instance in java not closingjava中的SQL语句实例未关闭
【发布时间】:2018-03-14 18:11:46
【问题描述】:

我找不到Statement 不关闭的地方。

有什么想法吗?

new Thread(() -> { 
    while (true) { 
        try (Statement statement = connection.createStatement(); 
            ResultSet rs = statement.executeQuery("SELECT * FROM `groups`")) { 
            while (rs.next()) { 
                executorService.submit(new VkBot(connection, rs)); 
            }
            Thread.sleep(1200); 
            rs.close(); 
        } catch (SQLException | InterruptedException e) { 
            e.printStackTrace(); 
        } 
    } 
}).start(); 

VkBot.java:

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.Random;

class VkBot implements Runnable {
    private Statement statement;
    private ResultSet rs;

    VkBot(Connection connection, ResultSet rs) throws SQLException {
        this.statement = connection.createStatement();
        this.rs = rs;
    }

    @Override
    public void run() {
        try {
            ...
        } catch (NullPointerException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

我在 3 分钟内收到了超过 600 个Statements

【问题讨论】:

  • 在你的线程中你没有关闭语句
  • 如果发现异常,你也不会关闭任何东西
  • 这段代码没有意义。你想通过将ConnectionResultSet 交给工作线程来完成什么?
  • 您为每个 VkBot 对象创建新的 Statement。然后为groups 表中的每一行创建VkBot 对象。所以如果表中有很多行,你就会有很多打开的语句

标签: java memory heap-dump try-with-resources


【解决方案1】:

您可能遇到了异常。 您尝试了两个 AutoClosable 对象,您正在关闭第二个对象并让第一个对象打开。 您应该执行以下操作之一:

  • 让第二个 ResultSet 打开 try-with-resource 关闭它
  • 关闭两者

第一个是正确答案。如果您使用的是 try-with-resource,请让 try 关闭您的资源。

查看 StatementImpl 是否是 AutoClosable(或只是 Closable)实现。


您正在使用try-with-resources 语句。 try 内分配的所有资源 应该AutoClosable 实现,JVM 将处理它,在离开语句之前关闭。

阅读 java 文档了解更多信息:try-with-resources Statement

【讨论】:

  • 如果对资源使用try,我可以不关闭对象吗?
  • 尝试资源已完成,您不必担心关闭对象!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多