editor php Yuzai membawakan anda Soal Jawab Java terkini: Sambungan SQL ditutup tanpa digesa. Semasa proses pembangunan, kami sering menghadapi masalah bahawa sambungan SQL tidak ditutup tanpa digesa, yang boleh menyebabkan kebocoran sumber dan masalah prestasi. Artikel ini akan menjawab soalan ini secara terperinci dan menyediakan penyelesaian untuk membantu anda mengendalikan situasi yang berkaitan dengan penutupan sambungan SQL dengan lebih baik. Mari kita ketahui bersama!
Apabila cuba menjalankan dua pertanyaan sql dalam urutan (seperti yang ditunjukkan dalam dbtest2), sistem mengembalikan ralat yang menyatakan bahawa sambungan sql telah ditutup, walaupun ia belum digesa untuk berbuat demikian.
Setakat ini saya telah cuba mengalihkan sambungan sqlconn ke lokasi yang berbeza, serta membuka dan menutup sambungan secara individu mengikut kaedah. Jika saya hanya memanggil pertanyaan sql, sistem berfungsi seperti yang diharapkan. Ini adalah kelasnya:
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")); } } }
Walaupun semua usaha saya, mesej ralat yang akhirnya saya dapat ialah:
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
Hasil yang diinginkan ialah output hanyalah senarai
Itu kerana anda menggunakan cuba sumber. Sila rujuk https://www.php.cn/link/533a7de111ee3af214eee5e09e3fa1bc untuk butiran lanjut.
Ini bermakna apabila anda meletakkan sambungan dalam blok percubaan. Sambungan ditutup selepas blok cuba dilaksanakan:
try (connection connection = sqlconn; preparedstatement ps = connection.preparestatement(sqlquery); resultset rs = ps.executequery()) {
Cuba alihkan sambungan di luar blok cuba seperti ini:
Connection connection = sqlConn; try (PreparedStatement ps = connection.prepareStatement(sqlQuery); ResultSet rs = ps.executeQuery()) {
Selepas melaksanakan semua pertanyaan, jangan lupa untuk menutup sambungan.
Sila ambil perhatian bahawa pilihan lain ialah membuka sambungan baharu setiap kali.
Atas ialah kandungan terperinci Sambungan SQL ditutup tanpa gesaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!