gpt4 book ai didi

oracle - Hibernate 统计日志记录

转载 作者:行者123 更新时间:2023-12-03 02:10:17 25 4
gpt4 key购买 nike

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

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

现在我看到像这样的 hibernate session 日志。

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 中读到的内容来看,这可能意味着查询被发送到数据库进行优化。但为什么总是在获取连接需求的时候呢?

关于如何进一步追踪问题、根本原因有什么建议吗?

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

感谢您的帮助!

最诚挚的问候,斯特凡

最佳答案

默认的 Hibernate 统计信息并不丰富。我们计划在 Hibernate 的 future 版本中增强这方面的功能。

但是,您可以提供自己的Statistics 实现,该实现构建于Dropwizard Metrics 之上。 .

简而言之,假设您有一个扩展 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);
}
}

您需要创建一个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 Metrics 使用各种存储库,因此您可以选择最适合您的用例的一个。

要了解 Dropwizard Metrics 的真正威力,请查看 FlexyPool也是如此。

关于oracle - Hibernate 统计日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43119982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com