每个HTTP请求的Hibernate日志直接在HTML页面中

时间:2015-02-18 20:10:32

标签: performance hibernate http logging

我想显示Hibernate执行的所有SQL查询,以便为特定的HTTP请求提供服务。

我想直接在HTML页面中将此信息作为底部的注释返回。这与常见的

类似
<!-- this page took X seconds to generate -->

除了会显示

<!-- this page took X hibernate queries to generate. -->
<!-- Here they are sorted by execution time: -->
<!--   query 1 -->
<!--   query 2 -->

为此,我需要在请求开始时将给定线程的Hibernate SQL日志重定向到给定的记录器。在请求结束时,我将获取该记录器的内容并将它们呈现到网页中。

我使用的是Spring MVC。有没有可以做到这一点的过滤器?

这适用于Intranet应用程序。我想让我的用户了解我的Hibernate低效率,因此他们有权说&#34;这需要2秒才能生成,因为你运行了1000个查询。修复它!&#34;

1 个答案:

答案 0 :(得分:1)

我使用自定义Hibernate Interceptor实现来计算每个请求执行的查询和Spring的HandlerInterceptor来拦截请求并启动计时器/计数器。

总体思路如下:

  1. 注册HandlerInterceptor以拦截所有请求
  2. 在请求开始之前,将当前时间(用于计时信息)存储在HandlerInterceptor的ThreadLocal中
  3. 发信号通知Hibernate Interceptor开始查询计数(计数器也存储在ThreadLocal中,因为每个请求都在自己的线程中运行)
  4. 请求完成后,控制权返回给HandlerInterceptor,从Hibernate Interceptor获取查询计数并计算请求处理的持续时间
  5. 记录时间和查询计数,将它们添加到模型中,以便在需要时也可以在页面上显示。
  6. 我还创建了一个实现此策略的sample application并编写了一个blogpost。它不会显示实际查询和执行时间(相反,它会显示查询计数),但应该很容易修改/调整它。