2
我希望從Java中的PostgreSQL中讀取大型表中的所有行。我正在Java軟件中逐行處理行。在Java PostgreSQL中使用遊標讀取有什麼缺點?
默認情況下,JDBC PostgreSQL驅動程序將所有行讀入內存,這意味着我的程序內存不足。
documentation談到「基於遊標獲取結果」使用st.setFetchSize(50);
我已經實現了這一點,它運行良好。
這種方法有什麼缺點嗎?如果不是,我會爲所有我們的查詢啓用它,無論大小,還是這是一個壞主意?
我不知道postgresql協議,但完全有可能在沒有指定fetchsize時完成最初的緩衝操作,但仍可能導致_n_往返行爲,因爲它仍然需要獲取這些行(其中_n_可能較小,但當您指定獲取大小時,往返次數也更大)。不同的是,這個成本是預先計算的,而不是每迭代50個項目。 –
我們在Lucene中爲1M條目的整個表建立索引。所以我們基本上做'SELECT * FROM my_table',然後逐個處理結果。只需要幾分鐘,所以它運作良好。但是,逐個處理它們(或者至少分批處理)比將它們全部加載到RAM中更有意義,然後_逐個處理它們。 –
@MarkRotteveel看起來像在線路上驅動程序只是發送'0'作爲行限制,如果fetchsize或limit沒有設置。我想可能會導致一次獲取超過50行,但我現在不打算進一步挖掘它。 – Kayaman