簡體   English   中英

Java MySQL jdbc與Hibernate一起執行Select查詢

[英]Java MySQL jdbc vs Hibernate on implementation of Select queries

對於這個模糊的問題,我們深表歉意,因為我不知道如何用恰當的句子來寫它,如果您想對它進行更有意義的編輯,請繼續。

我實際上想問,什么時候我們做這樣的事情:

Select * from TableWithBillionRecords Limit 1000000

使用任一結果集:

PreparedStatement.executeQuery()

或休眠:

getCurrentSession().createQuery(query).list()

一旦執行了該行,這是否意味着Web服務器實際上從我的數據庫服務器中提取了整整100萬行? 還是接口背后隱藏着一些流邏輯?

感謝您提供的信息,因為它可以幫助我確定是否應該將其拆分為多個查詢,逐個選擇一個塊,或者實際上只選擇一整堆都可以。

再次感謝你們。

大多數JDBC驅動程序的默認訪存大小為10。

在普通的JDBC編程中,如果要檢索1000行,則需要在應用程序和數據庫服務器之間進行100次網絡往返傳輸所有數據。 無疑,這會影響您的應用程序響應時間。

原因是JDBC驅動程序旨在從數據庫中獲取少量行,以避免出現內存不足的問題。

例如,如果您的查詢檢索到100萬行,則JVM堆內存可能不足以容納大量數據,因此JDBC驅動程序被設計為一次檢索少量(10行)的行,從而可以支持任意數量的行。只要您有更好的設計來處理應用程序編碼中的大行集,行數就可以了。

如果將提取大小配置為100,則到數據庫的網絡旅行次數將變為10。這將大大提高應用程序的性能。

調整提取大小時要考慮的重要注意事項:

  1. 確保您的JDBC驅動程序支持配置提取大小。
  2. 提取大小應基於您的JVM堆內存設置。 由於JVM堆大小在不同的環境之間會有所不同,因此請不要對獲取大小進行硬編碼,以使其保持為可配置參數。
  3. 如果獲取大小很大,則可能會遇到內存不足的問題。 例如,較少數量的列表可能比較大數量的列支持大行讀取大小。
  4. 您可以基於某些數據類型(例如blob,image等)設置獲取大小。我們對列遵循某些命名約定,例如,所有image和blob列的后綴均為“ Blob”。 如果查詢中不包含“ Blob”字樣,則設置較高的提取大小,否則設置較低的提取大小。

請參閱: http//webmoli.com/2009/02/01/jdbc-performance-tuning-with-optimal-fetch-size/

默認情況下, Hibernate會急切地獲取結果,因為與數據庫的大多數交互操作通常都是這樣:提取幾條記錄,顯示它們,可能修改它們,然后再次存儲。

提取數百萬行是一個完全不同的用例,主要用於以下情況:

  • ETL
  • 做分析(盡管您可能應該在數據庫中而不是在客戶端中進行分析)

具體來說, Hibernate沒有提供任何方法來像在JDBC或某些其他ORM中那樣在數據庫中保留惰性游標並進行惰性滾動。 但這不是必須的。 您始終可以在Hibernate項目中求助於純JDBC。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM