我的应用程序中存在连接泄漏问题,我看到连接数量随着一些小时(请求)的传递而逐渐增加 最后他们都被消耗了,我们得到了,我们使用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);
}
}
有人可以告诉我如何解决这个问题吗?
答案 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,取决于版本)。确保没有配置具有大量连接的连接池。