在Java / Spring中处理与数据库相关的异常

时间:2010-03-02 22:23:46

标签: java database spring

我现在正在阅读这本书Spring Recipes,并且对一件事情感到困惑:任何异常都被抛出作为DataAccessException的子类,一个你不想尝试/捕获的RuntimeException。

我担心的是更有可能发生的问题,尤其是插入时。如果您正在使用类似SimpleJdbcTemplate的东西,则每个查询都是它自己的事务,因此您无法确保表中没有密钥然后使用getSimpleJdbcTemplare.update()进行插入,因为密钥可能已插入到两个查询之间

显然,这是一个人们想要比生产系统中的RuntimeException更优雅地处理的东西。那么你如何应对呢?

感谢。

1 个答案:

答案 0 :(得分:2)

  

你不想要的RuntimeException   尝试/捕获

说谁?你没有拥有来捕捉RuntimeException,但没有什么可以阻止你这样做,这是完全可以接受的。例如,有一个名为DataAccessException的{​​{1}}的子类,它专门用于捕获,以便可以尝试重试。还有RecoverableDataAccessException,它解决了由于乐观锁定导致的下一个事务冲突点,也可以由应用程序专门捕获和处理。

  

如果你正在使用类似的东西   SimpleJdbcTemplate每个查询都是它的   自己的交易

不正确。如果您使用Spring的transactional semantics,那么OptimisticLockingFailureException(或您使用的任何DAO组件)将参与事务,如果数据库和事务管理支持它(最应该),则具有完整的ACID语义。对于您的示例,您可以在一个事务中执行SimpleJdbcTemplate(或数据库支持的任何内容)跟随select for update

Spring的数据访问层可能是它的最佳功能,但它很少得到它的信任。