休眠自動提交命令強制MySQL在過多的磁盤I / O中運行

親愛的大家,

我敢肯定,你們中的許多人都在使用Hibernate和MySQL,我自己在這里和那里都使用它。 通常,編程模型是不錯的,但是普通的JDBC可以快很多已經不是什么秘密了。 在這篇文章中,我想引起您的注意Hibernate在您的MySQL服務器中引起的一個小問題。

如果跟蹤Hibernate發送到MySQL數據庫的SQL,就會發現一致地,Hibernate以“ SET autocommit = 0”開始每個事務,并以“ commit”結束,然后是“ SET autocommit = 1”。 這些語句看似無害,但它們使MySQL將某些內部狀態刷新到磁盤上。 簡而言之,每次Hibernate調用這兩個語句之一時,MySQL都會編寫通常不會編寫的內容。 因此,與使用普通JDBC相比,使用Hibernate會使MySQL服務器在磁盤上的依賴更多。

我做了一個小實驗來證明這一點。 要重復此實驗,請找到帶有MySQL數據庫的空閑計算機。 機器不應運行任何會導致磁盤I / O的東西,否則效果將不像我看到的那么容易。

首先,我發送了一整串“ SELECT DUAL DUAL;” 命令進入MySQL提示。 像這樣:

while true; doecho "SELECT 1 FROM DUAL;"
done | mysql

查看iostat(8)的輸出,結果表明機器上沒有I / O。 top(1)確實表明機器正在運行。 由此可見,這些SELECT語句不會引起磁盤I / O。

接下來,我添加了Hibernate的自動提交命令,如下所示。

while true; doecho "SET AUTOCOMMIT=0;"echo "SELECT 1 FROM DUAL;"echo "COMMIT;"echo "SET AUTOCOMMIT=1;"
done | mysql

這次,iostat(8)確實表明存在磁盤I / O。 MySQL服務器比以前更努力地工作,同時仍然提供完全相同的答案。 這僅來自單個線程。 您的應用程序可能會在多個線程和連接上同時發出這些語句,從而加劇了問題。

對于無論如何都會導致I / O的查詢,我認為這種開銷可以忽略不計。 對于小型讀取查詢,這意味著您突然在數據庫服務器上執行磁盤I / O。

我還沒有找到一種方法來向Hibernate解釋我不想讓它將自動提交語句發送到數據庫。 您可以在Hibernate中關閉自動提交功能,但是只能關閉Hibernate的內部自動提交功能。 它不會停止將這些命令發送到數據庫。

讀取Hibernate源代碼(尤其是org.hibernate.transaction.JDBCTransaction的源代碼)可以看到,休眠使它在每次事務之前強制自動提交連接失敗,并在之后重置它。 這是硬編碼的。 休眠*想要*自動提交為關閉。

如果我的MySQL服務器僅服務于啟用了Hibernate的應用程序,我可能會考慮將數據庫服務器的默認自動提交模式關閉。 另外,我可以使用elideSetAutoCommits標志,這可能會減少自動提交切換的數量。 但是,這嚴重破壞了POLA 。 另外,我的服務器不僅僅提供支持Hibernate的應用程序,因此更改默認設置肯定會破壞其他地方。

所以,這讓我陷入困境。 我不能告訴Hibernate不要發出“ SET autocommit”,JDBC驅動程序不會禁止它們,也不能告訴MySQL忽略它們。

參考: Hibernate發送自動提交命令會強制MySQL在Java Monitor論壇上從我們的JCG合作伙伴 Kees Jan 做過多的磁盤I / O。

快樂編碼
拜倫

相關文章:

  • Hibernate映射集合性能問題
  • DataNucleus 3.0與Hibernate 3.5
  • 提升您的休眠引擎
  • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
  • JBoss 4.2.x Spring 3 JPA Hibernate教程

翻譯自: https://www.javacodegeeks.com/2011/07/hibernate-autocommit-commands-force.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374834.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374834.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374834.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

“應用程序無法正常啟動(oxc000007b)”解決方案

解決方案1 通過“DirectX修復工具 V3.3 標準版”軟件修復。 備注:經過測試,并未解決本人的問題,但是這個方法可能對游戲中缺失相關.dll(動態鏈接庫)有幫助。 解決方案2: 該問題的出現不適偶然,主…

Linux: dev: cmake: CHECK_LIBRARY_EXISTS

文章目錄 簡介例子源代碼最終調用到的兩個命令如果結果是這里為什么不直接使用rpm查看包呢?需要注意的問題 簡介 https://cmake.org/cmake/help/latest/module/CheckLibraryExists.html 這個方法是在Modules/CheckLibraryExists.cmake文件里定義的一個宏。 最終使用…

7-15 計算圓周率 (15 分)

根據下面關系式,求圓周率的值,直到最后一項的值小于給定閾值。 輸入格式: 輸入在一行中給出小于1的閾值。 輸出格式: 在一行中輸出滿足閾值條件的近似圓周率,輸出到小數點后6位。 輸入樣例: 0.01結尾無…

Struts2的全局結果視圖的配置

1.在struts.xml中的package標簽內添加<global-results/>標簽&#xff0c;將全局結果加進該標簽內&#xff0c;只適用于當前包下。 <package name"customer" namespace"/customer" extends"struts-default" > <global-results>…

長大了Java! 提出Java桌面版

不&#xff0c;這不是另一個“ Java已死”的咆哮。 Java非常活躍。 它是可用的最佳開發和運行時平臺之一。 迄今為止&#xff0c;最穩定的平臺。 那可能只是它最大的禍根。 荒謬&#xff01; 穩定性如何&#xff1f; 你可能會問。 好吧&#xff0c;由于它&#xff0c;您可以看到…

[算法練習]Excel Sheet Column Title

題目&#xff1a; Given a positive integer, return its corresponding column title as appear in an Excel sheet. For example: 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> AB 代碼&#xff1a; class Solution { public: string convertToTitle(…

7-16 求符合給定條件的整數集 (15 分)

給定不超過6的正整數A&#xff0c;考慮從A開始的連續4個數字。請輸出所有由它們組成的無重復數字的3位數。 輸入格式&#xff1a; 輸入在一行中給出A。 輸出格式&#xff1a; 輸出滿足條件的的3位數&#xff0c;要求從小到大&#xff0c;每行6個整數。整數間以空格分隔&#…

JUnit學習之hamcrest、testSuite介紹及測試原則

[轉自] http://huihai.iteye.com/blog/1994270 上一節說了junit的一些基本概念&#xff0c;主要使用assert做一些基本的判斷。但很多時候使用assert做判斷&#xff0c;并不方便&#xff0c;如果要判斷某幾個值是否為true或false&#xff0c;這時使用hamcrest來判斷就會方便許多…

Java最佳實踐– Vector vs ArrayList vs HashSet

在使用Java編程語言時&#xff0c;我們將繼續討論與建議的實踐有關的系列文章&#xff0c;我們將在三個最常用的Collection實現類之間進行性能比較。 為了使事情變得更現實&#xff0c;我們將在多線程環境下進行測試&#xff0c;以討論和演示如何將Vector &#xff0c; ArrayLi…

iOS:圖片上傳時兩種圖片壓縮方式的比較

上傳圖片不全面的想法&#xff1a;把圖片保存到本地,然后把圖片的路徑上傳到服務器&#xff0c;最后又由服務器把路徑返回&#xff0c;這種方式不具有擴展性&#xff0c;如果用戶換了手機&#xff0c;那么新手機的沙盒中就沒有服務器返回的圖片路徑了&#xff0c;此時就無法獲取…

7-17 爬動的蠕蟲 (15 分)

一條蠕蟲長1寸&#xff0c;在一口深為N寸的井的底部。已知蠕蟲每1分鐘可以向上爬U寸&#xff0c;但必須休息1分鐘才能接著往上爬。在休息的過程中&#xff0c;蠕蟲又下滑了D寸。就這樣&#xff0c;上爬和下滑重復進行。請問&#xff0c;蠕蟲需要多長時間才能爬出井&#xff1f;…

淺談泛型之泛型方法

實際不用多說只舉2個例子就行: //例1 static void fromArrayToCollection(Object[] a, Collection<?> c) {for (Object o : a) { c.add(o); // 編譯錯誤,錯誤原因也很簡單,<?>是無上下界的通配符泛型,所以編譯器根本無法確認類型} } //例2 static <T> void…

Android特效 五種Toast詳解

Toast是Android中用來顯示顯示信息的一種機制&#xff0c;和Dialog不一樣的是&#xff0c;Toast是沒有焦點的&#xff0c;而且Toast顯示的時間有限&#xff0c;過一定的時間就會自動消失。而且Toast主要用于向用戶顯示提示消息&#xff0c;接下來巴士為大家總結了Android五種To…

Java最佳實踐–高性能序列化

在使用Java編程語言時&#xff0c;我們將繼續討論與建議的實踐有關的系列文章&#xff0c;我們將討論并演示如何將對象序列化用于高性能應用程序。 所有討論的主題均基于用例&#xff0c;這些用例來自于電信行業的關鍵任務超高性能生產系統的開發。 在閱讀本文的每個部分之前…

7-18 二分法求多項式單根 (20 分)

二分法求函數根的原理為&#xff1a;如果連續函數f(x)在區間[a,b]的兩個端點取值異號&#xff0c;即f(a)f(b)<0&#xff0c;則它在這個區間內至少存在1個根r&#xff0c;即f0。 二分法的步驟為&#xff1a; 檢查區間長度&#xff0c;如果小于給定閾值&#xff0c;則停止&a…

java只使用try和finally不使用catch的原因和場景

JDK并發工具包中&#xff0c;很多異常處理都使用了如下的結構&#xff0c;如AbstractExecutorService&#xff0c;即只有try和finally沒有catch。 class X {private final ReentrantLock lock new ReentrantLock();// ...public void m(){lock.lock(); // block until condi…

Java 7:嘗試資源

本文研究try-with-resources語句的用法。 這是一個聲明一個或多個資源的try語句。 資源是一個對象&#xff0c;程序完成后必須將其關閉。 try-with-resources語句可確保在語句末尾關閉每個資源。 任何實現java.lang.AutoCloseable或java.io.Closeable接口的對象都可以用作資源。…

Spring學習(19)--- Schema-based AOP(基于配置的AOP實現) --- 配置切面aspect

Spring所有的切面和通知器都必須放在一個<aop:config>內&#xff08;可以配置包含多個<aop:config>元素&#xff09;&#xff0c;每個<aop:config>包含pointcut&#xff0c;advisor和apsect元素。ps&#xff1a;他們必須按照這個順序進行聲明 <aop:pointc…

2021-10-08

word文檔&#xff1a;.doc .docx 需求文檔、架構文檔、接口文檔、詳設文檔一般都是用word編寫。 Excel表格&#xff1a;.xls、.xlsx’&#xff0c;.csv 測試用例 PPT幻燈片&#xff1a;.ppt、*.pptx 版本不同 可執行文件&#xff08;windows系統&#xff09;&#xff1a; *.exe…

UITableViewCell 選中的狀態小技巧

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {[super setSelected:selected animated:animated]; //cell 沒被選中時 隱藏這個 _leftImageViewself.leftImageView.hidden !selected; //選中text變紅 不然變灰色self.textLabel.textColor selected ? [UICol…