当前位置: 首页 > 知识库问答 >
问题:

Hibernate统计日志记录

于嘉许
2023-03-14

我在解释Hibernate会话日志时有点卡住了。我的主要问题是许多查询有点慢 - 基于我实现的一些 TimeWatch 日志记录。为了进一步跟踪问题,我启用了Hibernate会话日志记录,目的是查看执行查询或获取连接的时间是否浪费(我猜这意味着配置错误)。

关于用例——Oracle DB、Spring、Hibernate。在“繁忙时间”,最多有15个线程对数据库执行查询。我想没什么特别的。

现在我看到hibernate会话日志如下。

2017-03-30 13:35:13.834+0200 [process-documents-task-6] I [/] o.h.e.i.StatisticalLoggingSessionEventListener - Session Metrics {
    636713687 nanoseconds spent acquiring 1 JDBC connections;
    57993 nanoseconds spent releasing 1 JDBC connections;
    636859879 nanoseconds spent preparing 1 JDBC statements;
    2231526 nanoseconds spent executing 1 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
    9261 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections)

2017-03-30 13:35:16.073+0200 [process-documents-task-8] I [/] o.h.e.i.StatisticalLoggingSessionEventListener - Session Metrics {
    2893793341 nanoseconds spent acquiring 1 JDBC connections;
    22196 nanoseconds spent releasing 1 JDBC connections;
    2893869403 nanoseconds spent preparing 1 JDBC statements;
    1509926 nanoseconds spent executing 1 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
    4056 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections)

但是这到底是什么意思呢?

我现在的解读

  • 执行查询的 1509926 纳秒(1.5 毫秒):似乎没问题
  • 获取连接的2893793341纳秒(2.8 秒):不行:(
  • 准备语句的2893869403纳秒(2.8 秒):不行:(

准备语句是什么意思?从我从javadoc中读到的内容来看,它可能意味着查询被发送到数据库进行优化。但是为什么总是在获取连接需求的时候呢?

关于如何进一步追踪问题,根本原因的任何建议?

或者关于问题可能是什么的任何提示?

谢谢你的帮助!

最诚挚的问候,斯特凡

共有1个答案

席俊达
2023-03-14

默认的HiberNate统计信息不是很丰富。我们计划在HiberNate的未来版本中增强这方面。

但是,您可以提供自己的统计实现,该实现构建在Dropw的指标之上。

简而言之,假设你有一个扩展org.hibernate.stat.internal.ConcurrentStatisticsImplTransactionStatistics类:

public class TransactionStatistics extends ConcurrentStatisticsImpl {

    private static final ThreadLocal<AtomicLong> startNanos = new ThreadLocal<AtomicLong>() {
        @Override protected AtomicLong initialValue() {
            return new AtomicLong();
        }
    };

    private static final ThreadLocal<AtomicLong> connectionCounter = new ThreadLocal<AtomicLong>() {
        @Override protected AtomicLong initialValue() {
            return new AtomicLong();
        }
    };

    private StatisticsReport report = new StatisticsReport();

    @Override public void connect() {
        connectionCounter.get().incrementAndGet();
        startNanos.get().compareAndSet(0, System.nanoTime());
        super.connect();
    }

    @Override public void endTransaction(boolean success) {
        try {
            report.transactionTime(System.nanoTime() - startNanos.get().get());
            report.connectionsCount(connectionCounter.get().get());
            report.generate();
        } finally {
            startNanos.remove();
            connectionCounter.remove();
        }
        super.endTransaction(success);
    }
}

您需要创建一个< code>StatisticsFactory实现:

public class TransactionStatisticsFactory implements StatisticsFactory {

    @Override
    public StatisticsImplementor buildStatistics(SessionFactoryImplementor sessionFactory) {
        return new TransactionStatistics();
    }
}

并像这样配置它:

<property 
    name="hibernate.stats.factory", 
    value="com.vladmihalcea.book.hpjp.hibernate.statistics.TransactionStatisticsFactory"
/> 

等等!

现在,您可以监控统计数据并将其导出为 Dropwizard Metrics 支持的任何格式。而且,Dropwizard 指标使用各种水库,因此您可以为您的用例选择最佳水库。

要查看Dropwizard Metrics的真正功能,请查看FlexyPool。

 类似资料:
  • 目前,我正在与 log4j2.7 springframework 4.3。5; 冬眠5.2。三, 我通过一个xml文件配置log4j 为此,我创建了一些appender,其中一个名为“General”。我需要的是,所有日志都必须转到该appender(包括springframework或hibernate生成的日志),并且后者都不会打印在控制台上(我仍然需要其他类中的其他日志) 我试着写这些日志:

  • 我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?

  • 问题内容: 我正在考虑将Redis用于Web应用程序日志记录目的。我用谷歌搜索,有人将日志转储到Redis队列/列表中,然后将计划的工作人员转储到磁盘中。 http://nosql.mypopescu.com/post/8652869828/another-redis-use-case- centralized-logging 我希望寻求理解,为什么不直接使用Redis持久化到磁盘?如果我分配了一

  • logging 模块自 2.3 版以来一直是 Python 标准库的一部分。在 PEP 282 中有对它的简洁描述。除了 基础日志教程 之外,这些文档是非常难以阅读的。 日志记录一般有两个目的: 诊断日志 记录与应用程序操作相关的日志。例如,当用户遇到程序报错时, 可通过搜索诊断日志以获得上下文信息。 审计日志 为商业分析而记录的日志。从审计日志中,可提取用户的交易信息, 并结合其他用户资料构成用

  • 问题内容: 当运行Spring / Hibernate应用程序时,我在控制台上看到以下不需要的输出: 我已经像这样配置了Log4j记录器: 如何使这些消息静音? 问题答案: 我相当确定您正在看到这些SQL语句,因为Hibernate配置中某处的属性“ hibernate.show_sql”设置为true。找到该设置并将其更改为false。

  • 我正在做一个Spring Boot项目,我正在检查它是否与这个漏洞有关,我没有任何Log4j核心依赖,但是我正在使用Hibernate核心5.0.12,它使用jboss日志3.3.1 当我检查jboss日志依赖时,我看到log4j: 先谢谢你