我正在使用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不会修改数据库。因此,实际上没有错误处理(例如,在回滚事务的意义上)。 SELECT的主要考虑因素是确定故障点。那是一个项目需求问题。

当这些步骤实际修改数据库时,它们通常被包装在需要回滚的事务中。再一次,您是回滚三个独立的catch块还是一个回滚,都是上述考虑之间的平衡。我个人的喜好是找到一种方法,可以对给定事务中的失败仅进行一次回滚,尽管这并非总是可能的。

10-06 15:01