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进行清理。