Oracle 休眠统计记录

Oracle 休眠统计记录,oracle,hibernate,session,logging,jdbc,Oracle,Hibernate,Session,Logging,Jdbc,我在解释hibernate会话日志时有点卡住了。 我的主要问题是,许多查询都有点慢——基于我实现的一些TimeWatch日志。 为了进一步追踪这个问题,我启用了hibernate会话日志,目的是查看执行查询或获取连接是否浪费了时间(我想这可能意味着配置错误) 关于用例的一点信息-Oracle DB、Spring、Hibernate。在“繁忙时间”,最多有15个线程对数据库执行查询。我猜没什么特别的 现在我看到hibernate会话日志如下 2017-03-30 13:35:13.834+0200

我在解释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)

但这到底意味着什么

我目前的解释

  • 执行查询的时间为1509926纳秒(1.5毫秒):似乎正常
  • 2893793341纳秒用于获取连接(2.8秒):不正常 :(
  • 2893869403纳秒用于准备语句(2.8秒):不正常 :(
准备声明是什么意思? 从我从javadoc中读到的内容来看,这可能意味着查询被发送到数据库进行优化。 但为什么它总是在需要连接的时候出现呢

有没有关于如何进一步追查问题根源的建议

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

谢谢你的帮助

致以最良好的祝愿,
Stefan

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

但是,您可以提供自己的
统计信息
实现,该实现构建在

简而言之,假设您有一个扩展了org.hibernate.stat.internal.ConcurrentStatisticsImpl的
TransactionStatistics
类:

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);
    }
}
并按如下方式进行配置:

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

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


要查看Dropwizard指标的真正威力,请同时查看。

我建议还提供DB连接池配置。池:最小大小2,最大大小15每个线程打开时都有一个单独的事务线程连接到不同的数据库(所有线程都具有相同的池设置)当SO上有人请求配置时,他希望看到实际的配置(即xml或属性文件等)例如,查看此处:。下一步是了解如何检查数据库连接池的日志。来自c3p0的关于此处连接的示例日志:它告诉您该池可以向应用程序提供4个免费连接。您应该查阅您正在使用的数据库池的文档。还可以查看其中解释了在应用程序请求JDBC连接以及DB连接池如何帮助时发生。在Hibernate会话中启用日志,您已成功清除了应用程序框。链中的下一个要检查的是DB连接池。如果在检查DB连接池行为后没有明显问题,您将不得不继续r然后请DB管理员从DB的角度观察情况。
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"
/>