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