这篇文章描述了我最近使用Hibernate ORM的经验。 多年以来,该框架并没有让我感到惊讶,您可能会在使用它时遇到性能问题。 我以为我已经看完了,但是这次我又措手不及了。

该问题的基础是在对一个完全不相关的库进行故障排除时建立的,该库导致我们的生产服务器之一出现问题。 为了收集有关手头原始问题的更多见解,我们增加了logback配置中的详细信息。

因此,产生以下描述的效果所需要的只是org。*软件包从ERRORWARN的日志冗长更改。 进行必要的测试后,我们从日志中收集了信息,却忘记了改回日志级别。

在日志配置传播到生产后不久,问题就在第二天开始暴露出来。 突然之间,我们的监视开始报告左右生产中的问题。 当我们吃自己的狗食并使用Plumbr Performance Monitoring解决方案监视我们自己的服务时,我们收到的信息是,发布给最终用户的某些服务面临着与延迟相关的问题。

检查公开的信息后,很明显一切似乎都受到了影响。 这次不是整个性能较差的代码位于单个服务/模块中的更典型的情况,而是整个JVM似乎行为异常。 此外,似乎对于99%的事务,延迟几乎没有受到影响,但是几乎所有服务的最坏情况下的延迟都已经消失了。

对我们来说幸运的是,问题的根源正盯着我们。 Plumbr检测到的根本原因列表已将罪魁祸首暴露给源代码中的一行。 我们面临的是成千上万的调用,它们正在JDBC上执行SHOW WARNINGS语句。

此外,Plumbr根本原因检测还向我们暴露了进行调用的调用堆栈:

com.mysql.jdbc.StatementImpl.executeQuery():1500
com.mysql.jdbc.SQLError.convertShowWarningsToSQLWarnings():714
com.mysql.jdbc.SQLError.convertShowWarningsToSQLWarnings():666
com.mysql.jdbc.StatementImpl.getWarnings():2299
com.zaxxer.hikari.pool.HikariProxyPreparedStatement.getWarnings():N/A
org.hibernate.engine.jdbc.spi.SqlExceptionHelper.handleAndClearWarnings():320
org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logAndClearWarnings():273
org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.close():529
... cut for brevity ...
org.hibernate.jpa.spi.AbstractEntityManagerImpl.merge():1196
sun.reflect.GeneratedMethodAccessor.invoke():N/A
sun.reflect.DelegatingMethodAccessorImpl.invoke():43
java.lang.reflect.Method.invoke():606
org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke():293
com.sun.proxy.$Proxy.merge():N/A
eu.plumbr.portal.service.ServiceDao.save():21

有了调用堆栈,我们直接进入了休眠状态。 显然,Hibernate在SqlExceptionHelper.handeAndClearWarnings()方法中包含以下代码:

public void handleAndClearWarnings(Statement statement, WarningHandler handler) {// See HHH-9174.  Statement#getWarnings can be an expensive call for many JDBC libs.  Don't do it unless// the log level would actually allow a warning to be logged.if (LOG.isEnabled(Level.WARN)) {try {walkWarnings( statement.getWarnings(), handler );}catch (SQLException sqlException) {// cut for brevity}//cut for brevity
}

在这里,我们有罪魁祸首,正视着我们。 对日志配置的更改已启用了Hibernate模块的WARN级别日志记录。 反过来,这导致对数据库的每次访问都执行重复的SQL查询“ SHOW WARNINGS ”,实际上使对数据库的JDBC调用次数增加了一倍。

根据Google的说法, 这个问题相当普遍。 这是Hibernate作者的合理设计吗? 一方面,该功能确实有用:如果您的JDBC访问已生成任何警告,则可能希望公开此信息。 乍一看,当前的实现绝对是合乎逻辑的:配置是否要查看一些警告,然后配置日志记录框架。

似乎毫无意义的是系统绝对不相关的方面(日志记录和数据库性能)之间的高度凝聚力。 配置日志记录会导致数据库调用数量增加一倍? 完全出乎意料的蝴蝶效果。 如果没有正确的工具,则可以对增加的数据库负载进行故障排除,很幸运。 这次,我们在20分钟内修补了该问题,然后继续进行工作,但是我只能想象,如果没有适当的监控工具来进行故障排除,需要花费多长时间。

翻译自: https://www.javacodegeeks.com/2016/01/how-we-accidentally-doubled-our-jdbc-traffic-with-hibernate.html

我们如何意外地将Hibernate的JDBC流量增加了一倍相关推荐

  1. Hibernate和JDBC、EJB比较

    参考:http://m.blog.csdn.net/article/details?id=7228061 一.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App S ...

  2. hibernate和jdbc的优缺点,概述

    1.分析hibernate和jdbc的优缺点 jdbc的优点和缺点 缺点 1.查询代码特别繁琐 2.重复性代码特别多,频繁的try,catch 3.没有做到数据的缓存 4.sql的移植性不好(mysq ...

  3. ASP.NET WebServices 因 URL 意外地以“/HelloWorld”结束,请求格式无法识别。

    今天在使用Asp.net做一个WebServices时通过Get方式调用方法时却出现了以下错误(仅在Get请求下,POST下正常) 在网络和MSDN上了解到WebServices默认只启用 HttpS ...

  4. spring 同时配置hibernate and jdbc 事务

    http://blog.csdn.net/mypop/article/details/6120377 在项目中同时用到了JDBC和Hibernate,分别配置了各自的事务,同时配置了不同的tx:ann ...

  5. 作为一个程序员,hibernate和jdbc 有什么不一样的点,你知道吗

    1.hibernate和jdbc主要区别就是,hibernate先检索缓存中的映射对象( 即hibernate操作的是对象),而jdbc则是直接操作数据库. 2.Hibernate是JDBC的轻量级的 ...

  6. WebService 出现因 URL 意外地以“/HelloWorld”结束,请求格式无法识别。

    因 URL 意外地以"/HelloWorld"结束,请求格式无法识别. 说明:   执行当前   Web   请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代 ...

  7. org.hibernate.TransactionException: JDBC begin transaction failed的解决方法

    异常: javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException ...

  8. 简述 Hibernate 和 JDBC 的区别、优缺点

    1.hibernate是一个开源的.采用面向对象的思想实现ORM映射框架,它对jdbc进行了一层封装,对于数据库的连接.关闭.数据的持久化(增删改查).事务的管理都进行了封装,使得程序开发的时候可以用 ...

  9. mysql使用jdbc连接增加ssl认证

    mysql使用jdbc连接增加ssl认证 1.创建用户并指定ssl连接 grant all on . to 'imooc'@'%' identified by 'imooc require SSL; ...

最新文章

  1. UVA 11645 Bits(组合数学)
  2. tenginx配置负载均衡
  3. new relic 官方简介
  4. Oracle中的Union、Union All、Intersect、Minus
  5. Python3 注释
  6. 《SpringCloud超级入门》Spring Cloud Eureka是什么?《八》
  7. rem,em,px的区别
  8. 零基础直接学Python入门IT合适吗?
  9. 依赖倒置原则_C#教您一步步摆脱面向过程:依赖倒置
  10. 危机中转型,如何获得领导的支持?
  11. android脚本精灵miui,脚本精灵安卓apk下载
  12. 云服务器搭建个人博客
  13. 实体消歧、实体统一和指代消歧
  14. 在win服务器查看系统报错日志文件,win2003查看及管理系统日志的方法
  15. 你没见过的中文编程工具,用中文开发android安卓应用,安卓开发的初体验!
  16. 【TensorFlow基础操作笔记】图+对话+张量+变量+线性回归实例
  17. TCP 的 3 次握手 4 次挥手,小学生都能看懂
  18. 足球与oracle系列(4):从巴西惨败于德国,想到,差异的RAC拓扑对比!
  19. AI人脸检测和人脸识别是一个概念吗?有什么区别?
  20. 阿里巴巴战略投资康佳旗下易平方和KKTV ,加速抢占大屏新赛道...

热门文章

  1. jdk1.8.0_45源码解读——ArrayList的实现
  2. Safari浏览器不支持let声明的解决方式
  3. 第三章用sql语句操作数据
  4. java操作字符串——CSDN博客
  5. 转:什么是 Base64编码
  6. spring多个视图解析器_在Spring中配置多个View解析器
  7. 注释嵌套注释_DIY注释
  8. Servlet和JSP之间的区别
  9. Java 14:查看更新的switch语句
  10. 数据库班级字段怎么定义名称_班级名称