我有一个将结果发送到客户端的服务器。但是经过几次连接后,出现异常“ java.sql.SQLException:连接太多”。
首先,我调用GetLEDsSettings,此函数调用DBS.GetResult(),然后关闭连接。但是连接仍然有效。当我执行“显示状态,其中variable_name ='threads_connected';”在工作台中,我可以看到“ Threads_connected”仍在增加。重新启动程序后,所有连接都消失了
我从这些解决方案中尝试了一些方法: How to overcome "java.sql.SQLException: Too many connections" exception?, MySql too many connections
LEDs.java:
private static String GetLEDsSettings() {
ResultSet rs = DBS.GetResult("SELECT * FROM ExtLED01_LED");
String res = "";
try {
while (rs.next()) {
res += rs.getString("LEDname") + ";";
res += rs.getString("Active") + ";";
res += rs.getString("Color") + ";";
res += rs.getString("LEDon") + ";";
res += LEDcontroll.GetStatus(rs.getString("LEDname")) + ";";
}
rs.close();
return res;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
DBS.java:
公共静态ResultSet GetResult(字符串查询){
ResultSet rs;
try {
TryConnect();
rs = stmt.executeQuery(query);
} catch (SQLException e) {
// TODO Auto-generated catch block
ShellCommunication.SendCommand("LOG -M 'Chyba databáze: " + e.getMessage() + "'");
Disconnect();
return null;
//e.printStackTrace();
}finally {
Disconnect();
}
return rs;
}
public static boolean ExecuteNonQuery(String query) {
try {
TryConnect();
stmt.execute(query);
} catch (SQLException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
ShellCommunication.SendCommand("LOG -M 'Chyba databáze: " + e.getMessage() + "'");
Disconnect();
return false;
}finally {
Disconnect();
}
return true;
}
public static void Disconnect(){
if (stmt != null) try { stmt.close(); } catch (SQLException logOrIgnore) {}
if (conn != null) try { conn.close(); } catch (SQLException logOrIgnore) {}
}
public static boolean TryConnect() {
if (JDBC_DRIVER == "" || DB_URL == "" || USER == "" || PASS == "") {
return false;
}else {
try {
conn = DriverManager.getConnection(DB_URL, USER, PASS);
stmt = conn.createStatement();
return true;
} catch (SQLException e) {
// TODO exception
System.out.println("DEBUG1: " + e);
ShellCommunication.SendCommand("LOG -M 'Chyba databáze: " + e.getMessage() + "'");
return false;
}
}
}
答案 0 :(得分:0)
每次程序查询数据库时,它都会打开一个新连接。如果它也不能关闭每个数据库(据我所知并没有),那么它一定会最终耗尽数据库支持的连接数量,而这正是正在发生的情况。
但是请注意,直到从ResultSet中读出查询结果之后,您才可以关闭连接,因为关闭连接也将关闭ResultSet。一个简单程序的通常解决方案是只打开一个连接,并将其重新用于所有查询。有多种方法可以使这种方法更可靠,但这将是一个单独的问题。