我使用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(){...}
}
如果这是不好的做法,我将如何以更传统的方式进行呢?
答案 0 :(得分:1)
虽然你的问题与征求意见有关,但我想集中讨论解决这个问题的问题。考虑到这一点,有三个关键考虑因素。在:
之间存在平衡您的示例实际上并不特别有趣,因为SELECT
不会修改数据库。因此,确实没有错误处理(例如,在回滚事务的意义上)。 SELECT
的主要考虑因素是确定失败点。这是一个项目要求问题。
当这些步骤实际修改数据库时,它们通常包含在需要回滚的事务中。再次,无论您是在三个单独的catch
块中还是在一个块中回滚,都是上述考虑因素之间的平衡。我个人的偏好是找到一种方法,只对特定交易中的失败进行一次回滚,尽管这可能并不总是可行。