performance - Hibernate 直接在 HTML 页面中记录每个 HTTP 请求

标签 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 效率低下的情况,因此他们有权说“这花了 2 秒才能生成,因为您运行了 1000 个查询。修复它!”

最佳答案

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

总体思路如下:

  1. 注册HandlerInterceptor来拦截所有请求
  2. 在请求开始之前,将当前时间(用于计时信息)存储在 HandlerInterceptor 的 ThreadLocal 中
  3. 向 Hibernate 拦截器发出信号以开始查询计数(计数器也存储在 ThreadLocal 中,因为每个请求都在其自己的线程中运行)
  4. 请求完成且控制权返回到 HandlerInterceptor 后,从 Hibernate Interceptor 获取查询计数并计算请求处理的持续时间
  5. 记录时间和查询计数,将其添加到模型中,以便在需要时也可以显示在页面上。

我还创建了一个sample application实现了这个策略并写了一个 blogpost关于它。它不会显示实际的查询和执行时间(而是显示查询计数),但应该很容易修改/调整它。

关于performance - Hibernate 直接在 HTML 页面中记录每个 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28592967/

相关文章:

performance - JedisPool 持有的默认连接

javascript - 检查一个字符串是否可以由 Javascript 中另一个字符串中的字符组成

java - 保存时跳过 Hibernate 验证

http - 为什么 Comet 需要分块编码响应?

linux - 将日志转发到 http 服务器

java - Algo 获取 Integer.MAX_VALUE 的超时

python - 比较 ruby​​ 和 python 代码之间的性能

java - Hibernate 对 findAll() 执行无限查询

hibernate - JPA:如何删除单向多对多关系中的链接记录?

http - 重写重定向以包括用于访问服务的端口