Connection,Statement和ResultSet在JDBC中多久closures一次?

每次查询之后是否需要closures并在每个查询的开始时进行初始化?

总是 您需要在尽可能最短的范围内获取并closures它们,以避免资源泄漏,事务性问题和连接池耗尽。 如果不这样做,迟早会导致数据库资源耗尽,导致出现“太多连接”等exception。

正常的JDBC语法如下所示,所有的资源在同一个try-with-resources块中打开closures:

public List<Entity> list() throws SQLException { List<Entity> entities = new ArrayList<Entity>(); try ( Connection connection = database.getConnection(); PreparedStatement statement = connection.prepareStatement(SQL_LIST); ResultSet resultSet = statement.executeQuery(); ) { while (resultSet.next()) { entities.add(map(resultSet)); } } return entities; } 

或者,当你不在Java 7上时:

 public List<Entity> list() throws SQLException { List<Entity> entities = new ArrayList<Entity>(); Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; try { connection = database.getConnection(); statement = connection.prepareStatement(SQL_LIST); resultSet = statement.executeQuery(); while (resultSet.next()) { entities.add(map(resultSet)); } } finally { if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {} if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} } return entities; } 

使用PreparedStatement将为您提供语句的数据库caching(在正确使用时防止SQL注入)旁边的好处。 获取和closures连接是最昂贵的任务,但在那里发明了连接池。 如果您想重复使用相同的语句来执行批量插入/更新,则可以使用批处理。

也可以看看:

  • 当我的应用程序失去连接时,我应该如何恢复?
  • 在multithreading系统中使用静态java.sql.Connection实例是否安全?

既然你不想要以前的查询的结果,当然你需要初始化ResultSet。

如果需要,可以保留语句,特别是PreparedStatements应该保留 – 它们可以在数据库首次运行时进行预编译,这会节省几秒钟的时间:

 "SELECT foo FROM bar WHERE a = ?" 

如果只有参数改变,当然。