【问题标题】:MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"MySQLNonTransientConnectionException:数据源拒绝建立连接,来自服务器的消息:“连接太多”
【发布时间】:2015-04-03 23:07:16
【问题描述】:

我的应用程序中存在连接泄漏问题,我发现连接数随着几个小时(请求)过去而增加 最后它们都被消耗掉了,我们得到了,我们使用的是带有默认 tomcat 7 和默认 mysql 5.0 的 JDBC

数据源拒绝建立连接,来自服务器的消息:“连接太多”

这是我们在服务器下看到的消息

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"
        at sun.reflect.GeneratedConstructorAccessor42.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
        at com.mysql.jdbc.Util.getInstance(Util.java:386)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1014)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
        at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1110)
        at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2465)
        at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2498)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283)
        at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:822)
        at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
        at sun.reflect.GeneratedConstructorAccessor30.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
        at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
        at java.sql.DriverManager.getConnection(DriverManager.java:571)
        at java.sql.DriverManager.getConnection(DriverManager.java:215)

我们确信我们正在关闭 java 文件中的所有数据库连接

实用类

public class DBConnection {

public static Connection getDBConnection() {
        String sURL="jdbc:mysql://localhost:3306/sss";
        //String sURL="jdbc:mysql://192.xxx.2.s:3306/sss";
        String sUserName="root";
        String sPwd="";
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(sURL, sUserName,sPwd);
            return conn;
            } catch (SQLException e) {
            e.printStackTrace();
            } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return conn;
    }


    public static void close(Connection con)
    {
        if (con != null)
        {
            try
            {
                con.close();
            }
            catch (SQLException e)
            {
                e.printStackTrace();
            }
        }
    }

}

这就是我访问连接的方式

public String adminLogin()
{
Connection dbConnection = null;

dbConnection = DBConnection.getDBConnection();

try
{
}
catch()
{

}

finally 
{
    DBConnection.close(dbConnection);
}
}

谁能告诉我如何解决这个问题??

【问题讨论】:

    标签: java


    【解决方案1】:

    这是关键问题....你应该调查这个问题....

    您可以通过在您的创建连接方法中添加以下代码来记录哪个方法正在创建新连接

        StackTraceElement[] st = Thread.currentThread().getStackTrace();
        System.out.println(  "create connection called from " + st[2] );
    

    可能某些代码正在循环中创建新连接,或者您的进程花费了很多时间,在关闭一些旧连接之前会创建新连接并且总连接数会增加..

    在mysql workbench中你可以通过这种方式查看连接总数 click here

    【讨论】:

      【解决方案2】:

      MySQL 有一个可配置的maximum number of connections allowed,它是 100(或 151,取决于版本)。确保您没有配置具有大量连接的连接池。

      【讨论】:

      • 但奇怪的是,我们只有 5 个人使用该应用程序,我确信不会使用 100 个连接。
      • 但是,你有连接池吗?
      • 不,我们没有任何连接池,只有默认连接池(应用程序目前处于开发阶段)
      • 我们需要tomcat连接池吗??我猜5个人不需要知道,如果我错了,请纠正我。
      • 如果没有其他信息,很难说出更多信息,但您可以通过监视数据库上 SHOW PROCESSLIST 的输出来跟踪连接的创建。它可能会帮助您调试连接何时创建以及它们是否完全关闭。
      猜你喜欢
      • 1970-01-01
      • 2012-08-18
      • 2011-08-12
      • 2014-05-01
      • 2011-03-13
      • 2016-10-28
      • 2010-10-30
      • 1970-01-01
      相关资源
      最近更新 更多