【发布时间】:2014-05-28 16:10:24
【问题描述】:
尝试查询 MySQL 数据库时遇到奇怪的问题;我在第一次调用 getConnection 时收到“连接过多”错误。我肯定在做一些愚蠢的事情吗?作为参考,我know the basics of closing connection,不仅我只打了一个电话,而且第一次尝试就失败了。所以我一定是在做一些非常愚蠢的事情?
两个类,一个调用查询,另一个执行查询: 导入 java.sql.*;
public class Main {
public static void main(String[] args) {
CollectorDb.findEvents();
}
}
public class CollectorDb {
private static String username = "foo";
private static String password = "bar";
private static String connectionString = "jdbc:mysql://awsdb/dbName" +
"?characterEncoding=UTF-8";
public static void findEvents() {
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
try {
Class.forName("com.mysql.jdbc.Driver");
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
// Next line throws Exception
conn = DriverManager.getConnection(connectionString, username, password);
// ** NEVER GET HERE **
// single query, then close all connections in a finally block
...
}
}
堆栈跟踪的第一行:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
...
Exception in thread "main" java.lang.RuntimeException: Too many connections
at com.lifesize.CollectorDb.findEvents(CollectorDb.java:64)
at com.lifesize.Main.main(Main.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
...
已经截断了我认为不相关的细节 - 很高兴提供更多代码或完整的堆栈跟踪,或者任何其他信息。
【问题讨论】:
-
这就是你调用 findEvents 的方式吗?只有一次?
-
您的代码在我看来是正确的(或者至少应该可以工作)。在任何情况下,错误都来自服务器。所以你可能想看看它是如何配置的,还有谁在连接到数据库。您可以尝试增加 my.cnf 中的连接数。
-
@SleimanJneidi 是的,只调用一次。 第一次尝试失败。
-
检查连接客户端的数量 SHOW STATUS WHERE
variable_name= 'Threads_connected'; -
@chris 如果该程序的早期版本运行并且有旧连接挂在它周围,可能会导致您现在无法获得连接。登录数据库,显示进程列表;杀死连接。再试一次