2014-10-02 83 views
3

使用Spring的JdbcTemplate,我一直在試圖找出一種乾淨的方式來記錄DAO層中的異常,但似乎無法弄清楚。我想記錄使用參數的SQL語句。Spring JdbcTemplate如何記錄異常參數?

例如,在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

我認爲我把這個標記爲重複的問題應該回答你的問題。可能最常用的解決方案是使用代理驅動程序(p6spy或log4jdbc),這是Balus的答案涵蓋的。我不喜歡catch-log-rethrow,每次出現超過一次的記錄異常會使日誌難以閱讀。 – 2014-10-02 15:01:44

+0

那麼這個鏈接是用於我知道的標準java jdbc庫。但我的問題與_Spring_庫有關。我覺得我可能會錯過一些東西,可能使用AOP?或者也許是Spring的一些日誌功能,它不是標準的java jdbc庫的一部分。 – 2014-10-02 15:05:58

+0

我不這麼認爲,但看到它會很有趣。在問題中加上澄清(使其更加明確),然後我會重新打開。 – 2014-10-02 15:09:05

回答

6

使用Spring做這件事的困難在於,您想要從中獲取此信息的JDBC對象不是Spring管理的對象,它們是由驅動程序創建的。所以Spring AOP不適用(不使用AspectJ)。

如果您在DEBUG級別記錄類別「org.springframework.jdbc.core.JdbcTemplate」,並且在TRACE級別記錄「org.springframework.jdbc.core.StatementCreatorUtils」,Spring可以爲您分別提供查詢和參數。

存在一些庫log4jdbcp6spy,它們實現了JDBC驅動程序的包裝,以便生成插入了參數的SQL語句。 See this question。使用其中的任何一個都應該是將jar添加到項目中,將jdbc url更改爲指向包裝器,然後調整日誌記錄以獲取所需的信息級別。

現有的日誌記錄代碼不好,因爲它是重複的剪切粘貼代碼,並且會導致異常記錄多次。日誌將更難閱讀,並會更頻繁地滾動。

+0

啊,我明白了。好的,這是我希望的更麻煩一些,但可能會導致我找到我想要的東西。謝謝 – 2014-10-02 15:42:40

0

絕對不使用這個模式:

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

,因爲如果經常導致重複日誌條目。應該有一些全球性的例外陷阱,其責任是記錄錯誤。

編輯

通過爲例外全球陷阱,我的意思是每一個應用程序應該有一定的機制,捕捉從Java代碼中大多數(理想地全部)異常和記錄它們。想象一下,你不會錯過並錯過登錄一些重要的錯誤。試圖弄清楚生產過程中發生的事情,你並不是盲目的。

所以讓我們假裝我們有這樣的例外記錄機制。您的模式會記錄SQL錯誤並拋出將被全局異常陷阱捕獲並再次記錄的異常。你不希望發生這種情況,所以不要將它記錄在代碼中,保存一行代碼,不要創建重複的日誌條目。

+0

您能否詳細闡述一下?你有沒有參考如何做到這一點「春天」的方式,或者是否有什麼我應該配置的log4j?只需要一點點讓我開始,我在網上找不到任何東西,但我可能搜索錯誤。 – 2014-10-02 15:41:07

+0

@JustinM我更新了我的回答 – luboskrnac 2014-10-02 16:10:10