【发布时间】:2014-03-26 21:24:34
【问题描述】:
有人能告诉我以下 JDBC 代码中是否需要第一个 stmt.close(); 来针对两个不同的表执行两个不同的 SQL 查询?
public class MyService {
private Connection connection = null;
public void save(Book book) {
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password");
PreparedStatement stmt = connection.prepareStatement("INSERT INTO PUBLISHER (CODE, PUBLISHER_NAME) VALUES (?, ?)");
stmt.setString(1, book.getPublisher().getCode());
stmt.setString(2, book.getPublisher().getName());
stmt.executeUpdate();
stmt.close(); //1
stmt = connection.prepareStatement("INSERT INTO BOOK (ISBN, BOOK_NAME, PUBLISHER_CODE) VALUES (?, ?, ?)");
stmt.setString(1, book.getIsbn());
stmt.setString(2, book.getName());
stmt.setString(3, book.getPublisher().getCode());
stmt.executeUpdate();
stmt.close(); //2
} catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }
finally { connection.close(); }
}
}
【问题讨论】:
-
我记得
close()是用来释放JDBC资源的 -
每个
PreparedStatement在使用后都需要关闭,所以,是的,你需要两个#close,就像你有两个PreparedStatements一样。不过,最好在finally块中关闭它们,就像使用Connection一样。 -
是的,否则您不会关闭第一个准备好的语句对象。您还应该考虑使用 try-with-resources 以避免在发生异常时不关闭语句。
标签: java sql jdbc prepared-statement