JDBC连接关闭

时间:2017-05-20 01:28:06

标签: java jdbc

有人可以告诉我在哪里以及如何关闭连接?我是否必须在Connection类或Controller类中关闭Connection?我已经尝试在连接类的方法结尾处放置followin:

def most_common(ar):
    y = {}

    for item in ar:
        y.setdefault(item, 0)
        y[item] += 1

    return max(y.items(), key=lambda x: x[1])

array = [1, 2, 1, 1, 2, 1, 3, 3, 1]
most_common(array)

(1, 5)  # (Most common item, occurrences of item)

然后我得到: “声明结束后不允许任何操作。”

这是我的代码:

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");
     }
 }
}

感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

完成使用后,您需要关闭连接。有很多方法可以解决这个问题,但我建议你这样做:

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类本身中正确处理。
  7. 另一种方法是完全取消DBConnection类,并让调用代码处理连接对象和自身的语句。当然,在这个小例子中,DBConnection抽象增加了最小的价值。

答案 1 :(得分:1)

当你按照斯蒂芬的指导行事时,请看看PreparedStatement ......

声明PreparedStatement而不是Statement

    private PreparedStatement pStmt;

创建PreparedStatement

     pStmt = con.prepareStatement("INSERT INTO `Subject` VALUES (?)");

重复使用PreparedStatement

public void addSubject(String subject) throws SQLException {
    pStmt.setString(1, subject);
    pStmt.executeUpdate();
    pStmt.clearParameters();
}

允许重复使用并提供一些注射保护。

答案 2 :(得分:0)

根本不要将连接等作为成员变量。您应该将它们全部(Connection, Statement/PreparedStatement, ResultSet)局部变量赋予它们并使用try-with-resources惯用法。

答案 3 :(得分:0)

不要在Connection类中关闭conn对象, 最好只在DAO classMain methodthe Method itself.

中关闭

例如:

public void addSubject(String subject) throws SQLException {
    ........
    ........//**some operations**
    // close here after some operation done
   if (conn != null) {
    try {
        conn.close();
    } catch (SQLException e) { sysout(e);}
} 
}