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

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需要更频繁地收集它们,并且活动连接的限制不会达到最大。

正确的方法是使用连接池,该连接池中的连接数量始终保持打开状态,这些连接只是从连接池中借用并返回到连接池中。毕竟建立连接是昂贵的。

09-10 13:46
查看更多