java - JDBC 连接关闭

标签 java jdbc

有人能告诉我在哪里以及如何关闭这里的连接吗?我必须在 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");
}

解释/评论:

  1. close() 方法是应用程序告诉 DBConnection 类“我已经完成”的方式。
  2. DBConnection 声明为 `AutoCloaseable 意味着我们可以使用 try-with-resources 来管理闭包......这更简单、更健壮。
  3. 根据良好的 OO 设计原则,实例变量是私有(private)的
  4. 根据 Java 约定更正了类名。
  5. 我们仍然需要小心确保在构造函数本身发生异常时不会泄漏连接。
  6. 我们允许 SQLException 传播给调用者。 DBConnection 类本身无法正确处理这些异常。

另一种方法是完全取消 DBConnection 类,让调用代码自己处理连接对象和语句。当然,在这个小示例中,DBConnection 抽象增加的值(value)很小。

关于java - JDBC 连接关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44081012/

相关文章:

java - 使用 Java 8 更改列表中元素的所有位置

java - 在子类中创建父对象时出错

java - 您需要数据库事务来读取数据吗?

java - 为什么从 main 读取非静态变量会出现问题?

java - org.hibernate.hql.internal.ast.QuerySyntaxException : unexpected token: FETCH

java - JDBC SQL 中的结果集

java - 使用 "StringUtils.join(array, "' ,'") 进行选择;"

java - 引用 JDBC 持久化、非 JPA 实体的 JPA 带注释的实体

java - 在JAVA中填充jTable

java - Struts2 在我的 AJAX 调用中返回空 JSON