直接在 HTML 页面中记录每个 HTTP 请求的 Hibernate 日志
Hibernate log per HTTP request directly in HTML page
我想显示 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。有过滤器可以做到这一点吗?
这是一个内部网应用程序。我想让我的用户看到我的 Hibernate 效率低下,所以他们有权说 "this took 2 seconds to generate because you ran 1000 queries. Fix it!"
我使用自定义 Hibernate 拦截器实现来计算每个请求执行的查询,并使用 Spring 的 HandlerInterceptor 来拦截请求并启动 timers/counters。
大致思路如下:
- 注册HandlerInterceptor拦截所有请求
- 在请求开始之前,将当前时间(用于计时信息)存储在 HandlerInterceptor 的 ThreadLocal 中
- 向 Hibernate 拦截器发出信号以开始查询计数(计数器也存储在 ThreadLocal 中,因为每个请求都在其自己的线程中运行)
- 一旦请求完成并且控制返回给 HandlerInterceptor,从 Hibernate Interceptor 获取查询计数并计算请求处理的持续时间
- 记录计时和查询计数,将它们添加到模型中,以便在需要时也可以显示在页面上。
我还创建了一个关于它的 sample application that implements this strategy and written a blogpost。它不会显示实际的查询和执行时间(而是显示查询计数)但应该很容易 modify/adapt 它。
我想显示 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。有过滤器可以做到这一点吗?
这是一个内部网应用程序。我想让我的用户看到我的 Hibernate 效率低下,所以他们有权说 "this took 2 seconds to generate because you ran 1000 queries. Fix it!"
我使用自定义 Hibernate 拦截器实现来计算每个请求执行的查询,并使用 Spring 的 HandlerInterceptor 来拦截请求并启动 timers/counters。
大致思路如下:
- 注册HandlerInterceptor拦截所有请求
- 在请求开始之前,将当前时间(用于计时信息)存储在 HandlerInterceptor 的 ThreadLocal 中
- 向 Hibernate 拦截器发出信号以开始查询计数(计数器也存储在 ThreadLocal 中,因为每个请求都在其自己的线程中运行)
- 一旦请求完成并且控制返回给 HandlerInterceptor,从 Hibernate Interceptor 获取查询计数并计算请求处理的持续时间
- 记录计时和查询计数,将它们添加到模型中,以便在需要时也可以显示在页面上。
我还创建了一个关于它的 sample application that implements this strategy and written a blogpost。它不会显示实际的查询和执行时间(而是显示查询计数)但应该很容易 modify/adapt 它。