gpt4 book ai didi

java - 内存有限的数据库连接对象行为

转载 作者:行者123 更新时间:2023-12-02 02:12:41 27 4
gpt4 key购买 nike

我了解到数据库连接应该毫无疑问地关闭,我什至明白为什么:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections" 

这是抛出上述异常的代码(在我的机器上):

public static void main(String[] args) {
try {
for (int i = 0; i < 1000; i++) {
Connection connection = getConnection();
Statement st = connection.createStatement();
st.execute("CREATE TABLE IF NOT EXISTS clients (id INT NOT NULL AUTO_INCREMENT, firstname VARCHAR(50), lastname VARCHAR(50), PRIMARY KEY (id))");
st.execute("DROP TABLE clients");
}

} catch (SQLException e) {
e.printStackTrace();
}
}

private static Connection getConnection() throws SQLException {
return DriverManager.getConnection(bundle.getString("jdbc.url"),
bundle.getString("jdbc.username"), bundle.getString("jdbc.password"));
}

最终我不得不减小堆大小,上面的代码开始工作。在这种情况下发生了什么?它如何能够无异常地持续创建连接?

最佳答案

我有根据的猜测是,底层连接类已经实现了 finalize() 方法,该方法在对象被 GC 时清理连接。

堆越大,GC 的工作就不会那么困难,因此连接不会被收集。堆越小,GC 需要更频繁地收集它们,并且 Activity 连接的限制不会达到最大值。

正确的方法是使用连接数量有限的连接池,这些连接始终保持打开状态,只是从池中借用并返回到池中。毕竟创建连接的成本很高。

关于java - 内存有限的数据库连接对象行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49759369/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com