【发布时间】: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。
【问题讨论】:
-
在你的线程中你没有关闭语句
-
如果发现异常,你也不会关闭任何东西
-
这段代码没有意义。你想通过将
Connection和ResultSet交给工作线程来完成什么? -
您为每个
VkBot对象创建新的Statement。然后为groups表中的每一行创建VkBot对象。所以如果表中有很多行,你就会有很多打开的语句
标签: java memory heap-dump try-with-resources