即使所有连接都正确关闭,MAX_USER_CONNECTIONS也会出现问题

时间:2011-08-22 13:31:29

标签: java mysql sql jsp

我在java中不太好。 我为客户创建了一个网站,但在交易过程中不断出现服务器连接失败等错误。由于基础异常:'com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:用户root已经超过'max_user_connections'活动连接'。 我正在使用的网站托管仅提供10个max_user_connections。但是如果我继续使用该网站,我会因为网络服务器不断点击而收到此错误。

这背后的原因是什么? 我没有关闭连接吗? 我已使用con.close()关闭了所有连接。

请帮忙

关心Apurv

打开我用过的连接

Connection con=null;
Statement st=null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
String useq="root";
String paq="manager";
String url="jdbc:mysql://localhost:3306/jayna?autoReconnect=true";
con=DriverManager.getConnection(url,useq,paq);
st=con.createStatement();

关闭我用过的连接

if(rs!=null){
rs.close();
}
if(st!=null){
st.close();
}
if(con!=null){
con.close();
}

我没有使用数据库池但是当我正确关闭每个连接时可以使用什么?

5 个答案:

答案 0 :(得分:0)

这似乎是连接泄漏的情况。

  1. 您确定已关闭所有连接吗?
  2. Conneciton.close()抛出IOException。检查是否能够成功关闭连接。
  3. 使用netstat或其他工具查找连接是否真正关闭或处于等待状态等。

答案 1 :(得分:0)

我认为你应该增加连接数。因为如果有10个慢查询并且您收到11个请求到您的站点11请求无法处理并且您收到此错误。 所以:

  1. 尝试增加一些连接。
  2. 尝试查找慢查询(使用慢查询日志)并优化它们

答案 2 :(得分:0)

连接池是一种提供一组即用型连接的技术,其中一个优点是可以节省每次调用的创建/打开时间。另一个优点是连接池可以帮助检测废弃的连接,即应用程序忘记关闭的连接。

Tomcat中有一个标准连接池,对于5.x版本,Tomcats查看here以获取某些信息,对于版本6看起来here,对于版本7信息可以找到here。它的removeAbandonedlogabandoned功能可以帮助您确定您的应用是否真的忘记关闭连接,或者仅仅是10还不够 - 请参阅Andrej的建议,您应该对您的查询进行分析。

答案 3 :(得分:0)

正如其他人所说,你要么没有关闭连接,要么你的应用程序在某些负载条件下只需要10个以上的并发连接。

  1. 如果错误始终发生在第11个请求上,则可能是您从未关闭连接。
  2. 如果它发生在某个时间后,不可预测,并自行消失,则更有可能10对于某些负载情况来说还不够。
  3. 如果它发生得太晚,不可预测,但永远不会自行消失,那么你可能无法在每次都没有被击中的特定情况下关闭连接。
  4. 如果10对于某些负载情况而言太小(选项2),您应该检查您的查询和代码逻辑,以确保您没有超过必要的连接时间您应该尝试正如其他人所建议的那样,转移到连接池。除此之外,从头开始创建新的连接比从池中重用它们需要更多的开销,因此可能导致单个访问花费的时间比需要的时间长得多。

答案 4 :(得分:0)

通过使用Singleton类结构初始化连接对象可以解决此问题。 使用Singleton模式,无论何时初始化连接对象,而不是创建新对象,它都将查找连接对象的现有实例并使用该实例(如果存在)。