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

时间:2015-02-04 12:17:39

标签: java

我的应用程序中存在连接泄漏问题,我看到连接数量随着一些小时(请求)的传递而逐渐增加  最后他们都被消耗了,我们得到了,我们使用JDBC与defualt tomcat 7和默认的mysql 5.0

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

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

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);
}
}

有人可以告诉我如何解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

这是至关重要的问题....你应该调查这个问题......

您可以通过在创建连接方法

中添加以下代码来记录创建新连接的方法
    StackTraceElement[] st = Thread.currentThread().getStackTrace();
    System.out.println(  "create connection called from " + st[2] );

有些代码可能会在循环中创建新连接,或者您的流程需要花费很多时间才能关闭一些旧连接,然后创建新连接并增加总连接数。

在mysql workbench中,您可以通过这种方式检查连接总数 click here

答案 1 :(得分:1)

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