SQL java 中的语句实例未关闭

SQL Statement instance in java not closing

我找不到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

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

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

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

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


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

阅读 java 文档以获取更多信息:try-with-resources Statement