2016-02-29 72 views
1

對於模糊的問題感到抱歉,因爲我不知道如何用正確的句子編寫它,如果你們中的任何人希望將它編輯爲更有意義的內容,請繼續。Java MySQL jdbc vs Hibernate實現Select查詢

我其實想問,當我們做這樣的事情:用

Select * from TableWithBillionRecords Limit 1000000 

無論結果集:

PreparedStatement.executeQuery() 

或休眠:

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

一旦線路執行,這是否意味着Web服務器實際上是從我的數據庫服務器拉出整個100萬行?或者在界面後面有一些流式邏輯?

感謝您提供的信息,因爲它可以幫助我決定是否應該將其分解爲多個查詢,以塊爲單位選擇塊還是實際上只需選擇一個塊即可。

再次感謝你們。

+0

搜索JDBC分頁 –

+0

Hibernate是JDBC之上的更高級別的ORM。我對Hibernate並不熟悉,但在JDBC中,可以使用setFetchSize()來獲得有效的分塊。 – seand

+0

@seand setFetchSize(Integer.MIN_VALUE)看起來非常有希望,但是可以肯定的是,逐行「流式傳輸」意味着只有單一連接權限?如果它是真的很棒.. –

回答

1

大部分的JDBC驅動程序的默認的獲取大小爲10

在正常JDBC編程,如果您想檢索1000行它需要你的應用程序和數據庫服務器來傳輸所有數據之間的100個網絡往返。這絕對會影響你的應用程序響應時間。

原因是JDBC驅動程序旨在從數據庫中提取少量行以避免任何內存不足問題。

例如如果您的查詢檢索一個百萬行的,JVM的堆內存可能不夠好,在一個時間來保存大量行數據,因此JDBC驅動器設計用於檢索少數(10行)這樣它可以支持任意數量的行,只要您有更好的設計來處理應用程序編碼中的大行設置即可。

如果將抓取大小配置爲100,則數據庫的網絡連接數將變爲10.這將顯着提高應用程序的性能。

重要提示時要考慮調取大小:

  1. 確保您的JDBC驅動程序支持配置獲取大小。
  2. 提取大小應該基於您的JVM堆內存設置。由於JVM堆大小在不同的環境中有所不同,因此請勿將硬編碼獲取大小保留爲可配置參數。
  3. 如果您的抓取大小很大,則可能會遇到內存不足問題。例如,較少數量的列表可能支持大行獲取大小而不是多列數。
  4. 您可以根據某些數據類型(如blob,image等)設置獲取大小。我們遵循特定的列命名約定,例如所有圖像和blob列都將具有後綴「Blob」。如果查詢不包含「Blob」字,則設置較高的提取大小,否則設置較低的提取大小。

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

0

Hibernate取結果急切地默認,因爲這是與數據庫的大多數交互往往是這樣的:取幾個記錄,顯示它們可能對其進行修改,再次對其進行儲存。

抓取數百萬行的是一個完全不同的使用情況下,主要應用於時:

  • ETL
  • 做分析(雖然你可能應該做分析數據庫中,而不是在客戶端)

具體來說,Hibernate doesn't offer any way to keep a lazy cursor在數據庫中,並像JDBC或其他一些ORM懶惰地滾動它。但它並不需要。你總是可以在Hibernate項目中使用普通的JDBC。