2010-03-02 38 views
1

我正在阅读Spring Recipes这本书,并且对此感到困惑:任何异常都是作为DataAccessException的子类引发的,您不打算尝试捕获RuntimeException/catch 。在Java/Spring中处理与数据库相关的异常

我担心的是更可能发生的问题,特别是插入问题。如果您使用的是类似SimpleJdbcTemplate的东西,则每个查询都是它自己的事务,因此您无法确保密钥不在表中,而是使用getSimpleJdbcTemplare.update()执行插入操作,因为可能在两个查询之间插入了密钥。

很明显,这是一个比生产系统中的RuntimeException更适合处理的东西。那么你如何处理?

谢谢。

+1

首先,并非每个查询都必须是一个事务,您可以按照您想要的任何方式划分事务,通常在服务方法级别。 你能否详细说明为什么你认为这个重复的关键问题会在你的应用程序中经常发生? – 2010-03-02 22:32:24

回答

2

a RuntimeException你不打算去 try/catch。

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

如果你正在使用类似 了SimpleJdbcTemplate每个查询是其 自己的事务

事实并非如此。如果您使用Spring的transactional semantics,那么SimpleJdbcTemplate(或您使用的任何DAO组件)将参与事务,如果数据库和事务管理器支持它(最应该),则使用完整的ACID语义。在你的例子中,你可以做一个select for update(或者你的数据库支持的)insert,全部在一个事务中。

Spring的数据访问层可能是它的最佳特性,但它很少得到好评。

+1

在本书中进一步阅读我看到你对事务处理是正确的。许多控制,以及很多配置方式。 关于捕捉异常,我认为这不应该只是说“你不必”,而是“但你应该,这是如何”是本书的错。谢谢你清理那个。 – 2010-03-04 05:08:05