如何分析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>