使用Spring的JdbcTemplate,我一直试图找出一种在DAO层中记录异常的简洁方法,但似乎无法弄明白。我想记录使用和参数的SQL语句。
例如,addStoreSql是参数化语句
public int addStore(Store store) {
return jdbcTemplate.update(addStoreSql, store.getId(), store.getName());
}
我正在做类似的事情。
public int addStore(Store store) {
try{
return jdbcTemplate.update(addStoreSql, store.getId(), store.getName());
} catch (DataAccessException ex) {
logger.error("exception on deleting store - " + store.toString(), ex);
throw ex;
}
}
我的问题是,有没有办法在许多dao方法中编写任何清洁工具?可能在记录器级别或一些Spring库?或者这是最干净的方式(或者上面的代码甚至是坏的)?
我有多个基本相同的方法,接受一个对象,将字段传递给查询并返回结果。
答案 0 :(得分:7)
使用Spring执行此操作的难点在于,您希望从中获取此信息的JDBC对象不是由Spring管理的对象,而是由驱动程序创建的。所以Spring AOP不适用(不使用AspectJ)。
如果您记录类别" org.springframework.jdbc.core.JdbcTemplate&#34>,Spring可以单独为您提供查询和参数。在DEBUG级别和" org.springframework.jdbc.core.StatementCreatorUtils"在TRACE级别。
现有的库log4jdbc和p6spy实现了JDBC驱动程序的包装,以便生成带有插入参数的SQL语句。 See this question。使用其中任何一个都应该是将jar添加到项目中,将jdbc url更改为指向包装器,并调整日志记录以获取所需的信息级别。
现有的日志记录代码不好,因为它是重复的cut-n-paste代码,并且会导致异常被多次记录。日志将更难阅读,并且会更频繁地滚动。
答案 1 :(得分:0)
绝对不要使用这种模式:
logger.error("exception on deleting store - " + store.toString(), ex);
throw ex;
因为如果经常导致重复的日志条目。应该有一些全局的异常陷阱,它的责任是记录错误。
修改强>
通过异常的全局陷阱,我的意思是每个应用程序都应该有一些机制来从Java代码中捕获大多数(理想情况下所有)异常并记录它们。想象一下,您没有捕获并错过日志中的一些重要错误。在试图找出生产中发生的事情时,你并不盲目。
所以让我们假设我们有这样的异常日志记录机制。您的模式将记录SQL错误并抛出将被全局异常陷阱捕获并再次记录的异常。您不希望发生这种情况,因此请不要在代码中记录,保存一行代码并且不要创建重复的日志条目。