在单个 try-catch 块中创建多个 PreparedStatements 是不好的做法吗?`

Is it bad practice to create multiple PreparedStatements inside a single try-catch block?`

我正在使用 JDBC 来执行 SQL 查询。如果我在一个需要执行的方法中有多个 SQL 查询,那么在主 try-catch 块中创建多个 PreparedStatements 是不是不好的做法? 例如

private Result method(long id) {
  final String STMT1 = "SELECT ..." 
  final String STMT2 = "SELECT ..."
  final String STMT3 = "SELECT ..."

  List<Things> thingsList;

  try(PreparedStatement p1 = c.prepareStatement(STMT1)) {
      PreparedStatement p2 = c.prepareStatement(STMT2);
      PreparedStatement p3 = c.prepareStatement(STMT3);

      p1.setLong(1, id);
      p2.setLong(2, id);
      p3.setLong(3, id);

      ResultSet r1 = p1.executeQuery();
      ResultSet r2 = p2.executeQuery();
      ResultSet r3 = p3.executeQuery();

      while(r1.next() && r2.next() && r3.next()) {
         ...
      }

      p2.close();
      p3.close();
   } catch(){...}
}

如果这是不好的做法,我将如何以更传统的方式进行?

尽管您的问题接近于征求意见,但我想重点关注解决实际问题时需要考虑的事情。以下是思考这个问题的三个关键考虑因素。有平衡:

  • 识别故障点
  • 错误处理
  • 编码简单和维护

你的例子其实不是特别有趣,因为SELECT没有修改数据库。因此,实际上没有错误处理(例如,在回滚事务的意义上)。 SELECTs 的主要考虑因素是确定故障点。那是一个项目需求问题。

当这些步骤实际修改数据库时,它们通常包含在需要回滚的事务中。再次重申,无论您是在三个单独的 catch 块中回滚还是在一个块中回滚,都是在上述考虑因素之间取得平衡。我个人的偏好是找到一种方法,只对给定事务中的失败进行一次回滚,尽管这可能并不总是可行的。