【问题标题】:Is it bad practice to create multiple PreparedStatements inside a single try-catch block?`在单个 try-catch 块中创建多个 PreparedStatement 是不好的做法吗?
【发布时间】:2016-05-01 15:41:32
【问题描述】:

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

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

【问题讨论】:

  • 这是非常自以为是的,但是 imo,是的,这是不好的做法。如果其中一个语句由于某种原因确实失败了,则可能更难具体追踪哪一个。通常的约定是将每个查询包装在单独的 try/catch 语句中,这样您就可以分别处理每个故障。编辑:经过进一步检查,@ColonelThirtyTwo 是正确的,因为这实际上设置不正确。
  • 只有第一个语句 (p1) 在 try 括号中,因此它是唯一受 try-with-resource 块保护的资源。这不是“坏习惯”,这是错误的。

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


【解决方案1】:

虽然您的问题接近于征求意见,但我想重点关注在解决真正问题时需要考虑的事项。以下是考虑这一点的三个关键考虑因素。之间有一个平衡:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多