使用JDBC获取与MySQL的连接时“连接太多”

时间:2014-05-28 16:10:24

标签: java mysql jdbc

尝试查询MySQL数据库时出现奇怪的问题;我得到了太多的连接"第一次调用getConnection时出现错误。当然,我必须做一些愚蠢的事情?作为参考,我know the basics of closing connection,不仅我只打了一个电话,它在第一次尝试时失败了。所以我必须做一些非常愚蠢的事情?

两个类,一个用于调用查询,另一个用于执行:     import java.sql。*;

public class Main {

    public static void main(String[] args) {

        CollectorDb.findEvents();
    }
}

public class CollectorDb {
    private static String username = "foo";
    private static String password = "bar";
    private static String connectionString = "jdbc:mysql://awsdb/dbName" +
            "?characterEncoding=UTF-8";

    public static void findEvents() {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rset = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


        try {
            // Next line throws Exception
            conn = DriverManager.getConnection(connectionString, username, password);
            // ** NEVER GET HERE **
            // single query, then close all connections in a finally block
            ...
    }

}

stacktrace的第一行:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
...
Exception in thread "main" java.lang.RuntimeException: Too many connections
    at com.lifesize.CollectorDb.findEvents(CollectorDb.java:64)
    at com.lifesize.Main.main(Main.java:13)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
...

已经截断了我认为不相关的详细信息 - 很高兴提供更多代码或完整的堆栈跟踪,当然还有任何其他信息。

1 个答案:

答案 0 :(得分:0)

正如SleimanJneidi和zmf在评论中指出的那样,问题根本不是我的代码,而是服务器本身;最大的线索是首次尝试无法连接

就我而言,我无法直接访问服务器,但以下内容将显示当前连接的客户端:

SHOW STATUS WHERE variable_name = 'Threads_connected';

回答我跟进“我如何连接以检查是否超出最大连接数” - MySQL为管理员保留连接,特别是出于这个原因。这可以在their documention

中找到
  

允许的连接数由   max_connections系统变量。默认值为151以进行改进   MySQL与Apache Web服务器一起使用时的性能。   (以前,默认值为100.)如果您需要支持更多   连接,你应该为这个变量设置一个更大的值。

     

mysqld实际上允许max_connections + 1 个客户端进行连接。该   额外连接保留供具有SUPER的帐户使用   特权。通过向管理员授予SUPER权限而不是   对于普通用户(谁不需要它),管理员可以连接   到服务器并使用SHOW PROCESSLIST来诊断问题,即使   已连接的非特权客户端的最大数量。见章节   13.7.5.30,“SHOW PROCESSLIST语法”。