Java 仅为当前线程/会话记录Hibernate SQL的最简单方法
我正在寻找跟踪由Hibernate生成的SQL查询的执行时间的最简单方法。 不幸的是,这不能用传统的方式完成——只需设置show_sql或hibernate logger,因为受监控的应用程序在生产环境中是多线程的,sql时间跟踪应该只对一个服务进行,这是有问题的。 服务意味着在Spring应用程序中运行的某些组件。但在我的例子中,可以安全地说,这是线程-线程在调用期间不会更改。服务实现是一个Java方法,该方法调用其他方法、组件等,我在一个线程中调用的所有内容。我可以更改一个方法源并部署它,但我无法发布应用程序。 不幸的是,AspectJ不能按原样使用,因为我无法更改整个应用程序、重新编译或将某些内容插入JVM。 不幸的是(下一步)DB管理员无法启用sql查询跟踪-他们不知道如何实现。 请帮助,如何在不挖掘整个应用程序的情况下优化Hibernate执行?最简单的方法是什么Java 仅为当前线程/会话记录Hibernate SQL的最简单方法,java,performance,hibernate,Java,Performance,Hibernate,我正在寻找跟踪由Hibernate生成的SQL查询的执行时间的最简单方法。 不幸的是,这不能用传统的方式完成——只需设置show_sql或hibernate logger,因为受监控的应用程序在生产环境中是多线程的,sql时间跟踪应该只对一个服务进行,这是有问题的。 服务意味着在Spring应用程序中运行的某些组件。但在我的例子中,可以安全地说,这是线程-线程在调用期间不会更改。服务实现是一个Java方法,该方法调用其他方法、组件等,我在一个线程中调用的所有内容。我可以更改一个方法源并部署它,但
事实:Hibernate 3.x、Spring 2.x、java 1.5您对过滤条件不是很明确:您想按线程/HTTP会话过滤sql还是从给定的服务过滤sql(sql时间跟踪应该只针对一个服务) 尽管如此,一切都可以在日志框架级别上完成。首先,您需要启用所有查询的日志记录,然后过滤掉不感兴趣的查询。我假设您正在使用(顺便说一句,Spring2.x和Java1.5.x已经过时了…) 每线程 实现Logback并从不感兴趣的线程中丢弃日志。或者与线程id一起使用作为键。来自给定线程的所有日志将被分派到一个单独的文件中 每个HTTP会话 这有点棘手,因为您需要从日志框架级别访问HTTP会话/会话id。简单的方法是使用MDC(参见示例:)。有了会话id,您可以执行类似于每个线程部分的过滤 每服务 不清楚你是什么意思。您只想记录从给定类发出的SQL查询,还是从类及其调用的所有方法和类发出的SQL查询?在这两种情况下,过滤时都需要检查调用堆栈,这不是很有效。另外,AspectJ在指令中有
——我想对您来说太重了
如果这是您想要实现的,请澄清您的问题,我有一些其他想法。您对筛选条件不是很具体:您想按线程/HTTP会话或从给定服务筛选sql(sql时间跟踪应该只针对一个服务)
尽管如此,一切都可以在日志框架级别上完成。首先,您需要启用所有查询的日志记录,然后过滤掉不感兴趣的查询。我假设您正在使用(顺便说一句,Spring2.x和Java1.5.x已经过时了…)
每线程
实现Logback并从不感兴趣的线程中丢弃日志。或者与线程id一起使用作为键。来自给定线程的所有日志将被分派到一个单独的文件中
每个HTTP会话
这有点棘手,因为您需要从日志框架级别访问HTTP会话/会话id。简单的方法是使用MDC(参见示例:)。有了会话id,您可以执行类似于每个线程部分的过滤
每服务
不清楚你是什么意思。您只想记录从给定类发出的SQL查询,还是从类及其调用的所有方法和类发出的SQL查询?在这两种情况下,过滤时都需要检查调用堆栈,这不是很有效。另外,AspectJ在
指令中有——我想对您来说太重了
如果这是您想要实现的,请澄清您的问题,我还有一些其他想法。假设您使用Logback作为日志框架,我会这样做
确保在您的logback配置上启用了扫描:
确保文件记录器在输出(%t)中包含线程名称:
%d{yyyy-MM-dd HH:MM:ss}%-5p%C{1}%t-%m%n
从关闭SQL日志记录开始:
一旦应用程序启动并运行,并且准备好执行测试,请编辑已部署应用程序的logback.xml文件,并将这些级别更改为“DEBUG”。然后执行测试。测试完成后,将这些级别设置回“关闭”
查看日志输出,确定感兴趣的线程名称,然后grep查找该线程名称:
grep“thread-1-pool-7”debug.log>sqldebug.log
有点麻烦,但它会工作。假设您使用Logback作为日志框架,我将如何做
确保在您的logback配置上启用了扫描:
确保文件记录器在输出(%t)中包含线程名称:
%d{yyyy-MM-dd HH:MM:ss}%-5p%C{1}%t-%m%n
从关闭SQL日志记录开始:
一旦应用程序启动并运行,并且准备好执行测试,请编辑已部署应用程序的logback.xml文件,并将这些级别更改为“DEBUG”。然后执行测试。测试完成后,将这些级别设置回“关闭”
查看日志输出,确定感兴趣的线程名称,然后grep查找该线程名称:
grep“thread-1-pool-7”debug.log>sqldebug.log
有点麻烦,但它可以工作