2014-10-29 55 views
0

我想使用@AspectHandlerInterceptor來記錄(幾乎)Spring/Hibernate Web應用程序中HTTP請求的所有數據庫活動。如何分析Java Spring/Hibernate應用程序中的所有數據庫活動?

理想情況下,我可以換了@Aspect@Around調用java.sql.Statement.execute,但由於該類是Java的,不得使用相同的類加載器,我不得不退而求其次。

我有一個@Aspect工作調用JdbcTemplate使用execution(* org.springframework.jdbc.core.JdbcOperations.*(String, ..))切入點如解釋here,但我也需要任何由Hibernate調用的數據庫活動。

有沒有人有此建議?我有任何建議。

回答

1

我的建議是使用AspectJ代替Spring AOP。它在Spring應用程序中的使用已有詳細記錄。然後你將擁有完整的AOP功率,例如你可以使用call()切入點等等,而不是僅僅使用execution(),將你的方面應用到不是Spring Beans的類,等等。

+0

感謝您的回答!不過,我不確定在我的Spring配置中使用AspectJ而不是Spring AOP還有什麼比使用''更有效。我使用的所有註釋都位於'org.aspectj.lang.annotation'包中。 – Andy 2014-10-29 18:01:54

+0

即使拋出的異常來自AspectJ:'org.aspectj.weaver.tools.UnsupportedPointcutPrimitiveException:切入點表達式'sqlOperation(sql)'包含不受支持的切入點原語'call'' ...我是否缺少某些東西? – Andy 2014-10-29 18:02:54

+0

是的,你錯過了autoproxy設置是針對Spring AOP的。 AspectJ不使用任何代理。查看Spring文檔,第[9.8將AspectJ與Spring應用程序結合使用]一章(http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/aop.html#aop-using-aspectj )。如果你不使用真正的AspectJ,你不能使用'call()'切入點。 – kriegaex 2014-10-29 21:00:54

1

那麼,如果你真的想剖析所有正在執行的數據庫操作,簡單的方法就是去記錄它們。不是使用AOP,而是建議您使用稱爲Log4JDBC的托架TPL。

基本上,所有你必須做的是像這樣的東西取代您的數據源聲明:

<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource" > 

一旦做到這一點,你只需要設置你的記錄器記錄相關的日誌信息。 log4Jdbc可用的各種記錄器是

jdbc.sqlonly: Logs only SQL 
jdbc.sqltiming: Logs the SQL, post-execution, including timing execution statistics 
jdbc.audit: Logs ALL JDBC calls except for ResultSets 
jdbc.resultset: all calls to ResultSet objects are logged 
jdbc.connection: Logs connection open and close events 

例如, :

<logger name="jdbc.sqltiming" additivity ="false">    
    <level value="info" />     
</logger> 
<logger name="jdbc.resultset" additivity ="false">    
    <level value="error" />   
</logger> 
<logger name="jdbc.audit" additivity ="false"> 
    <level value="error" />   
</logger> 
<logger name="jdbc.sqlonly" additivity ="false">    
    <level value="error" />   
</logger> 
<logger name="jdbc.resultsettable" additivity ="false">   
    <level value="error" />  
</logger>   
<logger name="jdbc.connection" additivity ="false">    
    <level value="error" />   
</logger> 
<logger name="jdbc.resultsettable" additivity ="false">    
    <level value="error" />   
</logger> 

更多詳細信息可在Log4JDBC official Site找到。

你可以找到休眠特定的設置here

我已經在使用JdbcTemplate的應用程序中成功實現了它。

+0

看起來像一個整潔的圖書館。不過,對於我的解決方案,我希望保持每個HTTP請求的運行時間。我不相信一個簡單的日誌庫可以實現這一點。不過,這個建議+1! – Andy 2014-10-30 13:20:33

相關問題