Heim > Java > SQL-Verbindung ohne Aufforderung geschlossen

SQL-Verbindung ohne Aufforderung geschlossen

WBOY
Freigeben: 2024-02-22 12:46:14
nach vorne
552 Leute haben es durchsucht

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!

Frageninhalt

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();
            }
        }
    }
}
Nach dem Login kopieren
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;     
    }
}
Nach dem Login kopieren
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"));
        }
    }
}
Nach dem Login kopieren

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
Nach dem Login kopieren

Das gewünschte Ergebnis ist, dass die Ausgabe nur eine Liste ist.

Abhilfemaßnahme:

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()) {
Nach dem Login kopieren

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()) {
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage