在单个 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
没有修改数据库。因此,实际上没有错误处理(例如,在回滚事务的意义上)。 SELECT
s 的主要考虑因素是确定故障点。那是一个项目需求问题。
当这些步骤实际修改数据库时,它们通常包含在需要回滚的事务中。再次重申,无论您是在三个单独的 catch
块中回滚还是在一个块中回滚,都是在上述考虑因素之间取得平衡。我个人的偏好是找到一种方法,只对给定事务中的失败进行一次回滚,尽管这可能并不总是可行的。
我正在使用 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
s 的主要考虑因素是确定故障点。那是一个项目需求问题。
当这些步骤实际修改数据库时,它们通常包含在需要回滚的事务中。再次重申,无论您是在三个单独的 catch
块中回滚还是在一个块中回滚,都是在上述考虑因素之间取得平衡。我个人的偏好是找到一种方法,只对给定事务中的失败进行一次回滚,尽管这可能并不总是可行的。