我使用 ExecutorService 和 FixedThreadPool 通过 JDBC 执行一些 SQL。但是,当我分析我的应用程序时,似乎线程数正在增加,当然内存也在增加。问题是这在某种程度上与 JDBC 有关,因为当我在线程池的任务中删除创建语句和连接时,线程数根本没有增加。
以下是我将任务汇总到我的线程池中的方式:
new Thread() {
public void run() {
ExecutorService executorService = Executors.newFixedThreadPool(5);
while (!isCancelled) {
executorService.submit(RunnableTask.this);
Thread.sleep(interval);
}
executorService.shutdown(); //wait for all tasks to finish and then shutdown executor
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); //wait till shutdown finished
} catch (InterruptedException ex) {
//
}
}
};
这是我在任务中所做的:
try (Connection con = pool.getConnection(); PreparedStatement st = (this.isCall ? con.prepareCall(this.sql) : con.prepareStatement(this.sql))) {
st.execute();
} catch (Exception e) {
//
}
这是上面提到的代码中使用的 ConnectionPool (pool.getConnection(),我使用 apache DBCP2:
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbcp2.BasicDataSource;
public class MySQLPool {
private BasicDataSource dataSource;
public MySQLPool setup(String driver, String uri, String user, String password, int maxConnections) throws Exception {
if (this.dataSource == null) {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(Main.driver);
ds.setUrl(uri);
ds.setUsername(user);
ds.setPassword(password);
ds.setMaxTotal(maxConnections);
ds.setMaxWaitMillis(2000);
this.dataSource = ds;
}
return this;
}
似乎线程没有正确结束,这很奇怪,因为如果 ExecutorService 是 5 个连接的固定池,它们应该用完吗?所以我不知道线程是如何仍然存在的,它们导致了相当大的内存泄漏。
问题在于创建 Connection 和 PreparedStatement 对象,因为当我将其注释掉时,线程数保持在固定值。