我在解释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)
但是这到底是什么意思呢?
我现在的解读
准备语句是什么意思?从我从javadoc中读到的内容来看,它可能意味着查询被发送到数据库进行优化。但是为什么总是在获取连接需求的时候呢?
关于如何进一步追踪问题,根本原因的任何建议?
或者关于问题可能是什么的任何提示?
谢谢你的帮助!
最诚挚的问候,斯特凡
默认的HiberNate统计信息不是很丰富。我们计划在HiberNate的未来版本中增强这方面。
但是,您可以提供自己的统计
实现,该实现构建在Dropw的指标之上。
简而言之,假设你有一个扩展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);
}
}
您需要创建一个< 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: 先谢谢你