hibernate删除记录

如何通过适当的日志记录解决一些最常见的Hibernate问题?

Hibernate的日志记录配置是一个重要但很少讨论的主题。 正确的配置可以帮助您在开发过程中发现潜在的问题,而错误的配置则可以在生产中导致严重的性能问题。 这就是我在新书《 Hibernate提示》中解释不同配置选项的原因之一 常见Hibernate问题的70多种解决方案

在本文中,我们将分享本书中最有用的2个Hibernate日志记录技巧。 让我们开始吧。

1.解决最常见的Hibernate性能问题

让我们看一下本书中包含的食谱之一。 它可以帮助您在开发过程中找到n + 1个选择问题。 当Hibernate必须初始化实体之间的延迟获取的关联时,经常会发生此性能问题。 不幸的是,在源代码中很难找到此问题,因为您仅调用了映射关联的属性的getter方法,例如author.getBooks() 。 如果在循环遍历Author实体列表的循环中执行此操作,则Hibernate必须执行1个查询以加载n个Author实体,并执行n个其他查询来初始化关联。 这称为n + 1选择问题,它是最常见的性能问题之一。

您可以通过激活Hibernate的Statistics组件找到它,该组件提供了一种简单的方法来对Hibernate Session中所有已执行的查询进行计数。 让我们看看它是如何完成的。

如何计算会话中已执行的查询

问题

我的一些用例很慢,似乎执行了太多查询。

如何计算在Hibernate 会话中执行的所有查询?

计算所有已执行查询的最简单方法是激活Hibernate的统计信息组件。 然后,Hibernate收集了大量内部统计数据,并将它们作为日志消息并通过Statistics API提供。

警告:请勿在生产中使用该产品! 收集统计信息会产生开销,从而降低您的应用程序速度。

默认情况下,Hibernate的统计信息组件处于禁用状态。 您可以通过将hibernate.generate_statistics参数设置为true来激活它。 您可以通过提供具有相同名称的系统属性或通过在persistence.xml文件中设置参数来执行此操作。

<persistence><persistence-unit name="my-persistence-unit"><description>Hibernate Tips</description><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><properties><property name="hibernate.generate_statistics" value="true" />…</properties></persistence-unit>
</persistence>

您有两个选项可以访问统计信息。 Hibernate可以将每个会话的最重要信息的子集写入日志文件,或者您可以通过Statistics API访问它们。

让我们先来看一下日志消息。 Hibernate在每个会话结束时会写一条类似于以下内容的日志消息。 它显示了SQL语句的数量,准备和执行它们所花费的时间以及与第二级缓存的交互。

16:24:55,318 INFO [org.hibernate.engine.internal.StatisticalLoggingSessionEventListener] – Session Metrics {25659 nanoseconds spent acquiring 1 JDBC connections;22394 nanoseconds spent releasing 1 JDBC connections;1091216 nanoseconds spent preparing 12 JDBC statements;11118842 nanoseconds spent executing 12 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;16999942 nanoseconds spent executing 1 flushes (flushing a total of 17 entities and 17 collections);63915 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections)

您还可以通过Hibernate的Statistics界面访问Statistics API。 您可以从SessionFactory获得它。 它提供了几种获取方法,使您可以访问比日志输出更详细的信息。

Statistics stats = sessionFactory.getStatistics();
long queryCount = stats.getQueryExecutionCount();
long collectionFetchCount = stats.getCollectionFetchCount();

源代码

在本书中,您可以找到带有可执行测试用例的项目的下载链接,其中包含可执行的测试用例。

学到更多

如果您想了解有关Hibernate日志记录功能的更多信息,请查看以下章节:

  • 如何记录SQL语句及其参数
  • 如何使用查询注释来识别查询

=============

计算已执行的查询可以帮助发现效率低下和避免性能问题。 但这还不够。 您还需要知道Hibernate执行哪些查询以及它使用哪些参数值。 使用正确的日志记录配置,Hibernate会将所有这些信息写入日志。

=============

2.如何记录SQL语句及其参数

问题

您如何配置Hibernate,使其将已执行SQL语句和已使用的绑定参数写入日志文件?

Hibernate使用两种不同的日志类别和日志级别来记录已执行SQL语句及其绑定参数:

  • SQL语句作为DEBUG消息写入类别org.hibernate.SQL
  • 绑定参数值以日志级别TRACE记录到org.hibernate.type.descriptor.sql类别中。

您可以在日志配置中相互独立地激活和停用它们。

警告:记录所有SQL查询及其绑定参数绑定会减慢您的应用程序的速度并创建巨大的日志文件。

您不应该在生产中激活这些日志消息。

以下代码段显示了一个可同时激活两者的log4j配置示例。

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%nlog4j.rootLogger=info, stdout
# basic log level for all messages
log4j.logger.org.hibernate=info# SQL statements and parameters
log4j.logger.org.hibernate.SQL=debug
log4j.logger.org.hibernate.type.descriptor.sql=trace

然后,Hibernate将类似于以下内容的日志消息写入您的日志文件。

17:34:50,353 DEBUG [org.hibernate.SQL] - select author0_.id as id1_0_, author0_.firstName as firstNam2_0_, author0_.lastName as lastName3_0_, author0_.version as version4_0_ from Author author0_ where author0_.id=1
17:34:50,362 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] - extracted value ([id1_0_] : [BIGINT]) - [1]
17:34:50,373 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] - extracted value ([firstNam2_0_] : [VARCHAR]) - [Thorben]
17:34:50,373 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] - extracted value ([lastName3_0_] : [VARCHAR]) - [Janssen]
17:34:50,374 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] - extracted value ([version4_0_] : [INTEGER]) - [0]

代码段中SQL语句不容易阅读。 当您告诉Hibernate格式化它时,情况会好得多。

您可以通过将配置参数hibernate.format_sql设置为true实现 。 您可以将其提供为系统属性,也可以在persistence.xml文件中进行设置,例如以下代码片段,或在hibernate.cfg.xml文件中进行设置。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence><persistence-unit name="my-persistence-unit"><description>Hibernate Tips</description><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><exclude-unlisted-classes>false</exclude-unlisted-classes><properties><property name="hibernate.format_sql" value="true" />...</properties></persistence-unit>
</persistence>

下面的代码片段显示了格式化SQL语句,它比上一条消息更易于阅读。

16:42:56,873 DEBUG [org.hibernate.SQL] -selectauthor0_.id as id1_0_,author0_.firstName as firstNam2_0_,author0_.lastName as lastName3_0_,author0_.version as version4_0_fromAuthor author0_whereauthor0_.id=?
16:42:56,926 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] - binding parameter [1] as [BIGINT] - [1]
16:42:56,950 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] - extracted value ([id1_0_] : [BIGINT]) - [1]
16:42:56,965 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] - extracted value ([firstNam2_0_] : [VARCHAR]) - [Thorben]
16:42:56,965 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] - extracted value ([lastName3_0_] : [VARCHAR]) - [Janssen]
16:42:56,966 TRACE [org.hibernate.type.descriptor.sql.BasicExtractor] - extracted value ([version4_0_] : [INTEGER]) - [0]

源代码

在本书中,您可以找到带有可执行测试用例的项目的下载链接,其中包含可执行的测试用例。

使您的日志更好

如前所述,激活TRACE和DEBUG级别的消息并将其发送到您的日志可能会导致文件很大,甚至可能减慢您的应用程序的速度。 但是,它们可能包含对于调试过程至关重要的信息,并且可以帮助您在关键错误投产之前确定关键错误。

OverOps会向您显示错误之前在生产中记录的最后250个DEBUG,TRACE和INFO级别的语句,即使它们已关闭并且从未到达日志文件。 它还显示任何异常,记录的错误或警告背后的变量状态,而无需依赖实际记录的信息。 您可以在错误的整个调用堆栈中看到完整的源代码和变量状态,甚至在微服务和计算机上也可以看到。

探索调试生产中错误的新方法。 观看OverOps的现场演示 。

结论

有关更多类似的食谱,请查看我的新书《 Hibernate Tips:70多种常见Hibernate问题的解决方案》 。 它为您提供了70多个现成的食谱,用于基本和高级映射,日志记录,Java 8支持,缓存以及静态和动态定义的查询等主题。 在短短几天内,您可以在hibernate-tips.com上以$ 2.99的价格获得电子书,以$ 12.99的价格获得平装本。

翻译自: https://www.javacodegeeks.com/2017/04/hibernate-logging-tips-solutions-common-problems.html

hibernate删除记录

hibernate删除记录_Hibernate记录:常见问题的提示和解决方案相关推荐

  1. 休眠日志:常见问题的提示和解决方案

    如何通过适当的日志记录解决一些最常见的Hibernate问题? Hibernate的日志记录配置是一个重要但很少讨论的主题. 正确的配置可以帮助您在开发过程中发现潜在的问题,而错误的配置则可以在生产中 ...

  2. php删除下拉框记录,删除一条数据_php删除一条记录(删除确认提示)

    摘要 腾兴网为您分享:php删除一条记录(删除确认提示),万师傅,万达普惠,双福汇,神州专车等软件知识,以及电视猫,南瓜电影,gps数据处理软件,手机qq普通,鼠标指针制作,国庆值班表,outlook ...

  3. 宝塔面板操作日志是存放在哪里的? 如何删除部分日志记录?

    问题背景:有时候我们登录了(不是自己权属的(譬如网Jing办安需要))宝塔面板,会留下登录及操作的日志,我们不想留下这些操作日志,可以通过下面的方法处理掉,以达到无痕迹访问操作的目的: 如图所示的面板 ...

  4. 手机上计算机记录怎么删除,手机怎么删除支付宝消费记录 清除支付宝账单明细方法...

    在支付宝这款软件中,用户使用它进行支付后都会有一个消费记录,最近,不少用户好奇,在即可以删除支付宝的消费记录吗,如果可以删除,应该怎么做,今天就给大家整理了消费记录删除教程. 在支付宝这款APP中,用 ...

  5. windows10系统删除本地git记录的账号密码

    由于切换账号,还是clone不到项目,总是提示文件夹不存在,如果出现这个问题,可以尝试删除本地保存的git账号和密码,重新再次clone项目 打开控制面板,进入用户账户: 进入凭据管理器: 选择Win ...

  6. php怎么删除多条,php 用checkbox一次性删除多条记录的方法

    一个简单示例 现有一个学生信息数据库,需要一次性删除多条记录 创建一个名为del.php的文件 代码如下: $link=mysql_connect("localhost",&quo ...

  7. SAP QM 样品废弃后如何删除physical samples记录?

    SAP QM 样品废弃后如何删除physical samples记录? 如果某个样品物理上被废弃掉不再需要保留了,则我们可以在QPR2里修改physical sample记录的修改界面,将'PhysS ...

  8. mysql支持跨表delete删除多表记录

    前几天写了Mysql跨表更新的一篇总结,今天我们看下跨表删除.  在Mysql4.0之后,mysql开始支持跨表delete.  Mysql可以在一个sql语句中同时删除多表记录,也可以根据多个表之间 ...

  9. mysql修改最后一条记录删除第一条记录

    //修改最后一条记录 UPDATE userinfo set userid='55' WHERE 1 ORDER BY userid DESC LIMIT 1 //删除第一条记录 delete fro ...

最新文章

  1. python正确方法,方法 - 廖雪峰的官方网站
  2. oracle结果集过大,多重子查询/大结果集查询问题
  3. 关于java的volatile
  4. 2021年零基础带你走进nacos的世界之云服务器下载安装nacos-小白教程,详细到爆了!
  5. 下载android4.4.2源代码全过程(附已下载的源代码)
  6. [数据结构]链表中销毁和清空的区别
  7. 离职113天后,微软的“中国先生”沈向洋云受聘清华大学教授
  8. oracle数据库补丁号解释,Oracle数据库版本对应的PSU和补丁号码
  9. python读取excel绘制柱状图_python读取excel制作柱状图和词云图片
  10. 【友情链接】吊打我的巨佬们
  11. 【汇编】更灵活的定位内存地址方式——and,or命令、SI、DI变址寄存器、直接寻址[idata]、寄存器间接寻址[bx]、寄存器相对寻址[bx+idata]、基址变址寻址、相对基址变址寻址
  12. 自制太阳能手机充电器
  13. 使用Unity实现时光倒流
  14. 螳螂有6条腿C语言,一只蜈蚣40只脚,一只螳螂有6只脚,现有蜈蚣和螳螂共35只,合计脚822只,蜈蚣和螳螂各多少只?...
  15. 做一个项目的详细步骤
  16. 互联网公司分布式系统架构演进之路
  17. PDO中错误处理:errorCode方法和errorInfo方法
  18. Linux下如何创建和取消软连接
  19. java jni
  20. FAQ02【Hive】:Hive连接后出现一堆乱七八糟的日志

热门文章

  1. 【无码专区1】简单路径的第二大边权(启发式合并+最小生成树)
  2. CF720C Homework(构造)(暴力)
  3. 判断溢出(ybtoj-字符串)
  4. AT2005-[AGC003E]Sequential operations on Sequence【差分,思维】
  5. P7078-[CSP-S2020]贪吃蛇【贪心,队列】
  6. codeforces773 D. Perishable Roads(思维+最短路)
  7. 10、mybatis中缓存的使用
  8. 1.数据湖deltalake初识
  9. 漫画:什么是拜占庭将军问题
  10. Spring Boot 最佳实践