我在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();
}
我没有使用数据库池但是当我正确关闭每个连接时可以使用什么?
答案 0 :(得分:0)
这似乎是连接泄漏的情况。
答案 1 :(得分:0)
我认为你应该增加连接数。因为如果有10个慢查询并且您收到11个请求到您的站点11请求无法处理并且您收到此错误。 所以:
答案 2 :(得分:0)
连接池是一种提供一组即用型连接的技术,其中一个优点是可以节省每次调用的创建/打开时间。另一个优点是连接池可以帮助检测废弃的连接,即应用程序忘记关闭的连接。
Tomcat中有一个标准连接池,对于5.x版本,Tomcats查看here以获取某些信息,对于版本6看起来here,对于版本7信息可以找到here。它的removeAbandoned
和logabandoned
功能可以帮助您确定您的应用是否真的忘记关闭连接,或者仅仅是10还不够 - 请参阅Andrej的建议,您应该对您的查询进行分析。
答案 3 :(得分:0)
正如其他人所说,你要么没有关闭连接,要么你的应用程序在某些负载条件下只需要10个以上的并发连接。
如果10对于某些负载情况而言太小(选项2),您应该检查您的查询和代码逻辑,以确保您没有超过必要的连接时间和您应该尝试正如其他人所建议的那样,转移到连接池。除此之外,从头开始创建新的连接比从池中重用它们需要更多的开销,因此可能导致单个访问花费的时间比需要的时间长得多。
答案 4 :(得分:0)
通过使用Singleton类结构初始化连接对象可以解决此问题。 使用Singleton模式,无论何时初始化连接对象,而不是创建新对象,它都将查找连接对象的现有实例并使用该实例(如果存在)。