Spring JdbcTemplate如何在异常时记录参数?

6
使用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库中? 还是这是最简洁的方式(或者上面的代码甚至不好)?

我有多个方法基本上都做同样的事情,接收一个对象,将字段传递给查询并返回结果。


那个链接是标准的Java JDBC库,我知道。但我的问题与Spring库有关。我觉得我可能错过了什么,可能是使用AOP?或者可能是Spring的某些日志记录功能,不属于标准的Java JDBC库。 - Justin Maat
2个回答

8
使用Spring完成此操作的难点在于,您希望从中获取信息的JDBC对象不是由Spring管理的对象,而是由驱动程序创建的。因此,如果不使用AspectJ,Spring AOP将无法应用。
如果您以DEBUG级别记录类别“org.springframework.jdbc.core.JdbcTemplate”和TRACE级别的“org.springframework.jdbc.core.StatementCreatorUtils”,Spring可以为您分别提供查询和参数。
已有的库log4jdbcp6spy实现了JDBC驱动程序的包装,以生成插入参数的SQL语句。请参见此问题。使用其中任何一个都只需将jar添加到项目中,将jdbc url更改为指向包装器,并调整日志记录以获得所需的信息级别。
现有的日志记录代码不好,因为它是重复的剪切粘贴代码,这将导致异常被多次记录。日志将更难阅读并更频繁地滚动。

啊,我明白了。好的,这比我希望的要麻烦一些,但有可能会帮我找到我想要的东西。谢谢。 - Justin Maat

0

绝对不要使用这个模式:

    logger.error("exception on deleting store - " + store.toString(), ex);
    throw ex;

因为经常会导致重复的日志条目,所以应该有一些全局异常捕获机制来负责记录错误。

编辑

通过全局异常捕获机制,我指的是每个应用程序都应该有一些机制来捕获Java代码中的大多数(最好是全部)异常并将其记录下来。想象一下,如果您没有捕获并错过了某些重要错误的日志记录,那么在尝试查明生产环境中发生了什么时,您就会变得盲目。

因此,让我们假设我们已经有了这样的异常记录机制。您的模式将记录SQL错误并抛出异常,然后被全局异常捕获机制捕获并再次记录。您不希望发生这种情况,因此不要在代码中记录它,节省一行代码并避免创建重复的日志条目。


1
你能否详细说明一下?你有关于如何用“Spring”的方式做这件事的参考资料吗?或者在log4j中是否有我应该配置的内容?只需要一点点启动我的进程,我在网上找不到任何东西,但我可能搜索错误了。 - Justin Maat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接