有人能告诉我在哪里以及如何关闭这里的连接吗?我必须在 Connection 类或 Controller 类中关闭 Connection 吗?我已经尝试将 followin 放在连接类中方法的末尾:
if (conn != null) {
try {
conn.close();
} catch (SQLException e) { /* ignored */}
}
但后来我得到: “语句关闭后不允许进行任何操作。”
这是我的代码:
public class DB_Connection {
String url = "XXX";
Statement statement;
public DB_Connection (){
try {
Connection con = (Connection) DriverManager.getConnection(url);
statement = (Statement) con.createStatement();
}
catch (SQLException ex){
System.out.println("Failed connection");
}
}
public void addSubject(String subject) throws SQLException {
try {
statement.executeUpdate("INSERT INTO `Subject` VALUES ('" + subject + "')" );
System.out.println("Added " + subject + "to database");
} catch(SQLException e) {
System.out.println("SQL Exception");
}
}
}
我从这里调用它:
public class MenuController {
@FXML
public void SendSubject(ActionEvent e) throws IOException, SQLException {
DB_Connection connection = new DB_Connection();
connection.addSubject("English");
}
}
感谢您的帮助!
最佳答案
使用完毕后需要关闭连接。有很多方法可以解决这个问题,但我建议您这样做:
public class DBConnection implements AutoCloseable {
private String url = ...
private Connection con;
private Statement statement;
public DBConnection () throws SQLException {
try {
con = DriverManager.getConnection(url);
statement = con.createStatement();
} finally {
// Avoid leak if an exception was thrown in createStatement
if (statement == null) {
con.close();
}
}
}
public void addSubject(String subject) throws SQLException {
statement.executeUpdate("INSERT INTO `Subject` VALUES ('" +
subject + "')" );
}
public void close() throws SQLException {
con.close();
}
}
然后像这样使用它:
try (DBConnection connection = new DBConnection()) {
connection.addSubject("English");
}
解释/评论:
close()
方法是应用程序告诉DBConnection
类“我已经完成”的方式。- 将
DBConnection
声明为 `AutoCloaseable 意味着我们可以使用 try-with-resources 来管理闭包......这更简单、更健壮。 - 根据良好的 OO 设计原则,实例变量是
私有(private)的
。 - 根据 Java 约定更正了类名。
- 我们仍然需要小心确保在构造函数本身发生异常时不会泄漏连接。
- 我们允许
SQLException
传播给调用者。DBConnection
类本身无法正确处理这些异常。
另一种方法是完全取消 DBConnection
类,让调用代码自己处理连接对象和语句。当然,在这个小示例中,DBConnection
抽象增加的值(value)很小。
关于java - JDBC 连接关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44081012/