php-Editor Yuzai bringt Ihnen die neuesten Java-Fragen und Antworten: SQL-Verbindung wird ohne Aufforderung geschlossen. Während des Entwicklungsprozesses stoßen wir häufig auf das Problem, dass die SQL-Verbindung nicht ohne Aufforderung geschlossen wird, was zu Ressourcenlecks und Leistungsproblemen führen kann. In diesem Artikel wird diese Frage ausführlich beantwortet und Lösungen bereitgestellt, die Ihnen helfen, Situationen im Zusammenhang mit dem Schließen von SQL-Verbindungen besser zu bewältigen. Finden wir es gemeinsam heraus!
Beim Versuch, zwei SQL-Abfragen nacheinander auszuführen (wie in dbtest2 gezeigt), gibt das System eine Fehlermeldung zurück, die besagt, dass die SQL-Verbindung geschlossen wurde, obwohl es nicht dazu aufgefordert wurde.
Bisher habe ich versucht, die sqlconn-Verbindung an einen anderen Ort zu verschieben und die Verbindung einzeln nach Methode zu öffnen und zu schließen. Wenn ich nur eine SQL-Abfrage aufrufe, funktioniert das System wie erwartet. Das sind die Kurse:
import java.sql.*; public class mysqlconnect { private static final string db_url = "jdbc:mysql://dbconnectionurl"; private static final string user = "username"; private static final string password = "pass"; private static connection mysqlconn; static { try { class.forname("com.mysql.cj.jdbc.driver"); mysqlconn = drivermanager.getconnection(db_url, user, password); system.out.println("mysql db connection is successful"); } catch (classnotfoundexception | sqlexception e) { e.printstacktrace(); // handle classnotfoundexception and sqlexception } } public static connection getmysqlconnection() { return mysqlconn; } public static void closeconnection() { if (mysqlconn != null) { try { mysqlconn.close(); system.out.println("mysql db connection is closed"); } catch (sqlexception e) { e.printstacktrace(); } } } }
import java.sql.*; import java.util.arraylist; public class sqlquery { private int userid; private string password; private boolean activated; private string usertype; connection sqlconn = mysqlconnect.getmysqlconnection(); // i want to be able to try accept this but idk how public string sqlsearch(string tbname){ // all string sqlquery = ""; if(tbname == ""){ throw new illegalargumentexception("criteria cannot be empty"); } sqlquery = "select * from " + tbname + ";"; if(sqlquery == ""){ throw new illegalargumentexception("sql query not set, something gone wrong"); } arraylist<string> resultlist = new arraylist<string>(); try (connection connection = sqlconn; preparedstatement ps = connection.preparestatement(sqlquery); resultset rs = ps.executequery()) { resultsetmetadata metadata = rs.getmetadata(); int columncount = metadata.getcolumncount(); if (rs.next()) { for (int i = 1; i <= columncount; i++) { string columnvalue = rs.getstring(i); resultlist.add(columnvalue); } } else { system.out.println("no match for " + tbname); } } catch (sqlexception e) { system.err.println("error executing sql query: " + e.getmessage()); e.printstacktrace(); } string result = string.join(", ", resultlist); return result; } }
public class dbtest2 { public class main { public static void main(string[] args) { person person = new person(2, "password123", true, "student"); system.out.println(person.sqlsearch("course")); system.out.println(person.sqlsearch("student")); } } }
Trotz all meiner Bemühungen erhielt ich letztendlich die Fehlermeldung:
MySQL Db Connection is successful CS101, CSC 101, Intro to Computer Science, 3 Error executing SQL query: No operations allowed after connection closed. java.sql.SQLNonTransientConnectionException: No operations allowed after connection closed. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:73) at com.mysql.cj.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:1610) at com.mysql.cj.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:1524) at Person.sqlSearch(Person.java:245) at dBtest2$Main.main(dBtest2.java:8) Caused by: com.mysql.cj.exceptions.ConnectionIsClosedException: No operations allowed after connection closed. at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:104) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:149) at com.mysql.cj.NativeSession.checkClosed(NativeSession.java:756) at com.mysql.cj.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:556) at com.mysql.cj.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:1539) ... 3 more
Das gewünschte Ergebnis ist, dass die Ausgabe nur eine Liste ist.
Das liegt daran, dass Sie Testressourcen verwenden. Weitere Informationen finden Sie unter https://www.php.cn/link/533a7de111ee3af214eee5e09e3fa1bc.
Das bedeutet, wenn Sie die Verbindung in einen Try-Block stellen. Die Verbindung wird geschlossen, nachdem der Try-Block ausgeführt wurde:
try (connection connection = sqlconn; preparedstatement ps = connection.preparestatement(sqlquery); resultset rs = ps.executequery()) {
Versuchen Sie einfach, die Verbindung wie folgt außerhalb des Try-Blocks zu verschieben:
Connection connection = sqlConn; try (PreparedStatement ps = connection.prepareStatement(sqlQuery); ResultSet rs = ps.executeQuery()) {
Vergessen Sie nach dem Ausführen aller Abfragen nicht, die Verbindung zu schließen.
Bitte beachten Sie, dass eine weitere Möglichkeit darin besteht, jedes Mal eine neue Verbindung zu öffnen.
Das obige ist der detaillierte Inhalt vonSQL-Verbindung ohne Aufforderung geschlossen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!