Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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
Java 仅为当前线程/会话记录Hibernate SQL的最简单方法_Java_Performance_Hibernate - Fatal编程技术网

Java 仅为当前线程/会话记录Hibernate SQL的最简单方法

Java 仅为当前线程/会话记录Hibernate SQL的最简单方法,java,performance,hibernate,Java,Performance,Hibernate,我正在寻找跟踪由Hibernate生成的SQL查询的执行时间的最简单方法。 不幸的是,这不能用传统的方式完成——只需设置show_sql或hibernate logger,因为受监控的应用程序在生产环境中是多线程的,sql时间跟踪应该只对一个服务进行,这是有问题的。 服务意味着在Spring应用程序中运行的某些组件。但在我的例子中,可以安全地说,这是线程-线程在调用期间不会更改。服务实现是一个Java方法,该方法调用其他方法、组件等,我在一个线程中调用的所有内容。我可以更改一个方法源并部署它,但

我正在寻找跟踪由Hibernate生成的SQL查询的执行时间的最简单方法。 不幸的是,这不能用传统的方式完成——只需设置show_sql或hibernate logger,因为受监控的应用程序在生产环境中是多线程的,sql时间跟踪应该只对一个服务进行,这是有问题的。 服务意味着在Spring应用程序中运行的某些组件。但在我的例子中,可以安全地说,这是线程-线程在调用期间不会更改。服务实现是一个Java方法,该方法调用其他方法、组件等,我在一个线程中调用的所有内容。我可以更改一个方法源并部署它,但我无法发布应用程序。 不幸的是,AspectJ不能按原样使用,因为我无法更改整个应用程序、重新编译或将某些内容插入JVM。 不幸的是(下一步)DB管理员无法启用sql查询跟踪-他们不知道如何实现。 请帮助,如何在不挖掘整个应用程序的情况下优化Hibernate执行?最简单的方法是什么


事实: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

  • 有点麻烦,但它可以工作