[英]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。這將大大提高應用程序的性能。
調整提取大小時要考慮的重要注意事項:
請參閱: http : //webmoli.com/2009/02/01/jdbc-performance-tuning-with-optimal-fetch-size/
默認情況下, Hibernate會急切地獲取結果,因為與數據庫的大多數交互操作通常都是這樣:提取幾條記錄,顯示它們,可能修改它們,然后再次存儲。
提取數百萬行是一個完全不同的用例,主要用於以下情況:
具體來說, Hibernate沒有提供任何方法來像在JDBC或某些其他ORM中那樣在數據庫中保留惰性游標並進行惰性滾動。 但這不是必須的。 您始終可以在Hibernate項目中求助於純JDBC。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.