Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我忘记关闭与数据库的连接_Java_Mysql - Fatal编程技术网

Java 如果我忘记关闭与数据库的连接

Java 如果我忘记关闭与数据库的连接,java,mysql,Java,Mysql,如果我关闭连接数据库,而不是关闭结果集,会发生什么? 我确实在下面写了一个例子。 比如说 Database.java public class Database{ try{ Connection con; PreparedStatement statement; ResultSet resultSet; public static void main{ Class.forName("com.mysql.jdbc.Driver"); String url = "jdb

如果我关闭连接数据库,而不是关闭结果集,会发生什么? 我确实在下面写了一个例子。 比如说

Database.java
public class Database{
try{
Connection con;
PreparedStatement statement;
ResultSet resultSet;
public static void main{
       Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/database";
        String _username="root";
        String _password = "password";
        Connection db = DriverManager.getConnection(url,_username,_password);
String sqlQuery = "select * from category";        
statement = db.prepareStatement(sqlQuery);
resultSet = statement .executeQuery();
while(resuletSet.next()){

......
}

// i dont close connect.
resultSet.close();
//what happen then it? connection.close() , will it be automatically down ?
}catch(Exception e){
e.printStackTrace();
}
     }
          }

仔细关闭
结果集是正确的。在处理完这些对象后,将它们留在周围肯定是导致内存泄漏的一种方法

当不再需要对象时,还应关闭
连接。如果您的Java程序终止任何
连接
对象,您仍然打开的对象将自动关闭。如果没有对这些对象进行任何查询,那么MySQL服务器将关闭连接,并在Java放弃连接时进行清理

Java自版本7以来就有了一种干净的管理方法。你能行

try (Connection db = DriverManager.getConnection(url,_username,_password)){
    //use the connection object
    ...
   try (ResultSet result = stmt.ExecuteQuery(whatever)) {
       // use the resultset
   } catch (whatever) { whatever }
}
catch(whatever) { whatever }
这是避免这些泄漏的好方法;Connection和ResultSet对象在try/catch块末尾自动关闭,就像它们在
finally{}
子句中关闭一样。它叫

是的,处理完后请关闭连接。如果在未关闭的情况下打开许多
连接
对象,则会发生两件坏事:

  • 不那么糟糕:Java程序的RAM会泄漏
  • 更糟糕的是:MySQL服务器的连接槽将被填满,它将开始拒绝新的连接。使用服务器资源的客户端bug通常是坏bug
未能关闭连接可能是有害的,因为典型的程序使用的连接不如结果集多。因此,积累大量未关闭的连接需要更长的时间,并且在测试时可能无法检测到问题。测试人员直接登录MySQL服务器,运行
showProcessList系统测试期间的命令,以查看未关闭的连接是否正在累积


关闭结果集和连接

你可能会发现解释的行为我认为初学者不容易察觉@joakimdanielsonty检查你的答案会泄漏连接、套接字和所有相关的内存,在这一端,也在数据库端。数据库服务器可能会在超时后关闭空闲连接,这会在其结束时解决问题,但在您的结束时不会。Java不会干净地关闭任何东西。操作系统可能会,也可能不会。很好。如果客户端程序放弃连接或突然关闭连接,则实际上是MySQL进行清理。