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

时间:2016-05-01 15:41:33

标签: java sql jdbc try-catch prepared-statement

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

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(){...}
}

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

1 个答案:

答案 0 :(得分:1)

虽然你的问题与征求意见有关,但我想集中讨论解决这个问题的问题。考虑到这一点,有三个关键考虑因素。在:

之间存在平衡
  • 识别故障点
  • 错误处理
  • 编码简单和维护

您的示例实际上并不特别有趣,因为SELECT不会修改数据库。因此,确实没有错误处理(例如,在回滚事务的意义上)。 SELECT的主要考虑因素是确定失败点。这是一个项目要求问题。

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