日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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刪除記錄

總結

以上是生活随笔為你收集整理的hibernate删除记录_Hibernate记录:常见问题的提示和解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。