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

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删除记录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java velocity详解_[velocity] velocity详解

(1)为什么要使用模版语言&#xff1f;在服务器端可以使用 Velocity处理模板和生成的动态内容(HTML、XML等)。这和JSP技术的目标非常接近。但是&#xff0c;JSP模型可以毫无阻碍地访问底层的Servlet API和Java编程语言。它基本上是一种在很大程度上开放的访问模型。而作为一种完…

pc端游戏修改器_原神:不要吐槽手机内存了,想要获得最佳游戏体验,PC端最合适...

想必大家这段时间都被一个米哈游公司的游戏给刷屏了吧&#xff0c;它就是号称用时三年&#xff0c;斥资一亿美元打造的《原神》&#xff0c;正是这种情况下&#xff0c;原神的关注远远要高于其他游戏&#xff0c;并且玩家的期望值也是和关注度成正比。但是&#xff0c;一经发布…

java调用命令行命令_Java命令行界面(第4部分):命令行

java调用命令行命令我的Java命令行解析系列的第四部分介绍了Commandline &#xff0c;它被描述为 “用于解析命令行参数的Java库”&#xff0c;它“基于使用注释从命令行参数到对象的映射”。 像以前介绍的args4j和jbock一样&#xff0c; Commandline使用注释来提供潜在命令行…

JVM 内存示意图(内存结构图/内存解析图)

图 1&#xff1a; 图 2&#xff1a; 图 3&#xff1a; 图 4&#xff1a;

java登录界面命令_Java命令行界面(第8部分):Argparse4j

java登录界面命令Argparse4j是“ Java命令行参数解析器库”&#xff0c;其主页将其描述为“基于Python的argparse模块的Java命令行参数解析器库”。 在本文中&#xff0c;我将简要介绍如何使用Argparse4j 0.7.0处理命令行参数&#xff0c;该参数类似于本系列中的前七篇文章中有…

协议管理模块设计

文章目录协议和合同的区别协议表说明协议签署日志协议和合同的区别 如果协议的内容写得比较明确、具体、详细、齐全&#xff0c;并涉及到违约责任&#xff0c;即使其名称写的是协议&#xff0c;也是合同&#xff1b;如果协议的内容写得比较概括、原则、很不具体&#xff0c;也…

java登录界面命令_Java命令行界面(第7部分):JCommander

java登录界面命令这是我系列的第七篇文章&#xff0c;简要介绍了用于处理Java命令行参数的各种库。 这篇文章回到了基于注释的库的覆盖范围&#xff0c;该库似乎是在Java中可用于处理命令行参数的众多可用库中知名度最高&#xff0c;最受欢迎的库之一&#xff1a; JCommander 。…

java体系技术框架_java框架之Spring 核心框架体系结构

很多人都在用spring开发java项目&#xff0c;但是配置maven依赖的时候并不能明确要配置哪些spring的jar&#xff0c;经常是胡乱添加一堆&#xff0c;编译或运行报错就继续配置jar依赖&#xff0c;导致spring依赖混乱&#xff0c;甚至下一次创建相同类型的工程时也不知道要配置哪…

IntelliJ IDEA中打开项目时用 Import Project(导入项目) 和 Open(打开项目) 的区别

文章目录创建测试目录使用 Open 方式打开用 Import Project 方式打开用 Open 方式打开文件夹下的多个项目用 Import Project 的方式打开多个项目总结对于 IDEA 中如下图所示的 Import Project 和 Open Project 的区别&#xff0c;一开始不明白怎么回事&#xff0c;网上看了很多…

java命令模式返回值_JAVA 设计模式 命令模式

目录用途命令模式 (Command)将一个请求封装为一个对象&#xff0c;从而使你可以用不同的请求对客户进行参数化&#xff1b;对请求排队或请求日志&#xff0c;以及支持可撤销的操作。命令模式是一种行为型模式。结构图-命令模式结构图Command: 用来声明执行操作的接口。abstract…

IntelliJ IDEA for Mac 如何创建普通的Java项目_创建项目_新建项目

文章目录创建 Java 新项目的流程普通 Java 项目结构Java 项目结构特例讲解创建 Java 新项目的流程 Create New Project Empty Project &#xff08;1&#xff09;选择【Empty Project】&#xff0c;则项目不会自动创建模块&#xff0c;项目创建成功之后&#xff0c;会自动弹出…

java 集成开发工具_最好的Java开发人员测试和集成工具

java 集成开发工具通过从您的应用程序学习企业APM产品&#xff0c;发现更快&#xff0c;更有效的性能监控。 参加AppDynamics APM导览&#xff01; 无论您是刚刚起步还是已经从事了一段时间&#xff0c;使用正确的工具进行编程都可以对项目的成功产生巨大的影响。 适当的工具使…

aws高额账单_取消堆放以提高延迟并减少AWS账单

aws高额账单大多数性能问题可以通过几种不同的方式解决。 多数人都容易理解和应用许多适用的解决方案。 一些解决方案&#xff08;例如从JVM管理的堆中删除某些数据结构&#xff09;更加复杂。 因此&#xff0c;如果您不熟悉此概念&#xff0c;我建议您继续学习我们最近如何减少…

Iphone 手机如何导入/导出通讯录

打开苹果云官网&#xff0c;选择「通讯录」&#xff0c;点击左下角的「设置」&#xff0c;可以看到导入/导出菜单 点击进入 icloud 官网

intellij远程调试_IntelliJ中的远程调试Wildfly应用程序

intellij远程调试远程调试Java应用程序意味着使用本地开发环境连接到远程运行的应用程序。 Java开箱即-agentlib:jdwp[options]支持远程调试&#xff1a;目标应用程序必须使用-agentlib:jdwp[options]选项执行&#xff0c; -agentlib:jdwp[options]选项加​​载Java调试线协议&…

微信小程序注册/登录接口开发

文章目录后端有关说明前端有关说明接口设计小程序注册/登录接口APP 注册/登录接口PC Web 端的注册/登录接口小程序注册/登录序列图校验 token后端有关说明 登录和注册的逻辑要独立抽取写成2个接口&#xff1a;注册接口、登录接口 小程序、APP、PC端的登录接口和注册接口要分开…

couchbase_使用Portworx和Couchbase的有状态容器

couchbase容器本应是短暂的&#xff0c;因此可以很好地扩展以用于无状态应用程序。 有状态的容器&#xff08;例如Couchbase&#xff09;需要区别对待。 管理Docker容器的持久性概述了如何管理有状态容器的持久性。 该博客将说明如何使用Docker Volume Plugins和Portworx创建有…

在 MyEclipse 中配置 tomcat

在 IDE 配置 tomcat 实则就是让 IDE 来管理 tomcat 配置 步骤 1 点击工具栏上的“Run/Stop/Restart MyEclipse Servers”图标旁边的下拉箭头 步骤 2 选择“Configure Server” 步骤 3 在弹出的对话框“Preferences”中展开“MyEclipse” – “Servers” – “Tomcat”–“To…

java 中怎么加汉字,jquery怎么向body里面增加文字

jquery如何向里面增加文字jsp代码是这样的&#xff1a;我想在页面加载时动态的将一行文字增加到里面&#xff0c;不知道为什么总是加不进去&#xff0c;js代码如下&#xff1a;$(document).ready(function(){if($("#type").val()"MESSAGE") {$(".ke-t…

MacBook 推出移动硬盘时总是提示有程序在使用它,如何解决?

如下图所示&#xff1a; 先使用命令 df -lh 在终端查看当前系统的所有硬盘&#xff0c;命令如下&#xff1a; liaowenxiongliaowenxiongdeMacBook-Air ~ % df -lh Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1s5s1 234Gi…