Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何分析JavaSpring/Hibernate应用程序中的所有数据库活动?_Java_Spring_Hibernate_Aop_Aspectj - Fatal编程技术网

如何分析JavaSpring/Hibernate应用程序中的所有数据库活动?

如何分析JavaSpring/Hibernate应用程序中的所有数据库活动?,java,spring,hibernate,aop,aspectj,Java,Spring,Hibernate,Aop,Aspectj,我想使用@Aspect和HandlerInterceptor记录(几乎)Spring/Hibernate web应用程序中HTTP请求的所有数据库活动 理想情况下,我可以将@Aspect>调用包装为java.sql.Statement.execute,但由于该类是java类,可能不使用相同的类加载器,因此我必须满足于第二个最佳选择 我有一个@Aspect用于使用执行(*org.springframework.jdbc.core.jdbcooperations.*(String,…)切入点调用Jd

我想使用
@Aspect
HandlerInterceptor
记录(几乎)Spring/Hibernate web应用程序中HTTP请求的所有数据库活动

理想情况下,我可以将
@Aspect
>
调用包装为
java.sql.Statement.execute
,但由于该类是java类,可能不使用相同的类加载器,因此我必须满足于第二个最佳选择

我有一个
@Aspect
用于使用
执行(*org.springframework.jdbc.core.jdbcooperations.*(String,…)
切入点调用JdbcTemplate,如前所述,但我还需要Hibernate调用的任何数据库活动


有人对此有什么建议吗?我愿意接受任何建议。

我的建议是使用AspectJ而不是Spring AOP。它在Spring应用程序中的使用有很好的文档记录。然后,您将拥有完整的AOP功能,例如,您可以使用
call()
切入点和更多切入点,而不仅仅是
execution()
,将您的特性应用于非SpringBean的类等等。

如果您确实想评测正在执行的所有数据库操作,一种简单的方法是记录它们。我建议您不要使用AOP,而是使用一种称为Log4JDBC的离线TPL

基本上,您所要做的就是用如下内容替换数据源声明:

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

<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>

有关更多详细信息,请访问

您可以找到特定于hibernate的设置


我已经在使用JdbcTemplate的应用程序中成功地实现了它。

谢谢您的回答!不过,我不确定除了在Spring配置中使用AspectJ而不是SpringAOP之外,还有什么事情要做。我使用的所有注释也都在
org.aspectj.lang.annotation
包中。甚至引发的异常也来自aspectj:
org.aspectj.weaver.tools.UnsupportedPointcutPrimitiveException:Pointcut表达式“sqlOperation(sql)”包含不支持的切入点原语“call”
。。。我遗漏了什么吗?是的,您遗漏了autoproxy设置是针对Spring AOP的。AspectJ不使用任何代理。查看Spring文档,第章。如果不使用真正的AspectJ,就不能使用
call()
切入点。如果设置编译时编织不是那么复杂,我想这就是我的方法。它提供了我所需要的灵活性,但我认为在我的开发环境中使用Eclipse和Gradle设置编译时编织是不值得的。我会把这个标记为正确的,因为如果我进一步研究的话,它可能就是解决方案。谢谢如果您阅读我指给您的那一章,您会发现它描述的是LTW(加载时编织),而不是CTW(编译时编织)。;-)顺便说一句,使用Maven设置CTW或LTW都不是那么容易。但我不能对格雷德尔说什么,我是一个专业人士,看起来像一个整洁的图书馆。不过,对于我的解决方案,我希望保持每个HTTP请求的运行时间记录。我不相信一个简单的日志库能够做到这一点+不过,我还是同意你的建议!
<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>