2010-02-04 85 views
1

我在使用Spring Jdbc從數據庫中檢索數據時遇到了問題。這是我的問題:spring jdbc RowCallbackHandler噩夢

我在我的DAO上有一個getData()方法,它應該從某些select語句的結果返回一行。當再次調用時,getData()方法應該以類似FIFO的方式返回第二行。我的目標是一次只能在記憶中獲得一個結果,因爲我的表將在未來獲得巨大的潛力,並將所有內容都帶入記憶中,這將是一場災難。

如果我在結果集中使用常規的jdbc代碼,我可以將其獲取大小設置爲1,一切都會好的。然而,我最近發現,通過JdbcTemplate對象的Spring Jdbc操作不允許我實現這樣的行爲(據我所知...我對Spring框架的功能並不瞭解)。我聽說過RowCallbackHandler接口,並且在java牧場中發佈了this後我說可以以某種方式公開稍後使用的結果集(儘管使用這種方法它將結果集存儲多次,因爲有很多行,這很漂亮啞)。

我一直在玩着實現RowCallbackHandler接口一天,我仍然無法找到一種方法讓它從我的選擇一次檢索一行。如果有人能夠在這個問題上給我啓發,我會非常感激。

回答

1

經過大量的搜索和諮詢我們團隊的其他成員後,我們得出結論,這不是我們項目的最佳實施路徑。正如鮑里斯所說,另一種方法是要走的路。不過,我正在做一些不同的事情,並使用SimpleJdbcTemplate來分割我的查詢,以便它更好地適應內存。我的記錄表中​​的「狀態」字段將負責判斷記錄是否成功處理或讀取,因此我知道接下來要讀取哪些記錄。

問題如果Spring Jdbc能夠在我的OP中提到的行爲是,但是,仍然在空氣中。如果任何人有這個問題的答案,我相信它會幫助其他人。

乾杯!

1

您可以採取不同的方法。創建一個查詢,它將只返回您想要讀取的行的ID。將這些ID保存在內存中。你真的需要擁有龐大的數據集才能消耗大量的內存。遍歷它並逐個加載由其ID引用的行。

1

JdbcTemplate.setFetchSize(int fetchSize)

設置獲取大小此的JdbcTemplate。這對於處理較大的結果集非常重要:將此設置爲高於默認值將以內存消耗爲代價提高處理速度;將其設置得更低可以避免傳輸永遠不會被應用程序讀取的行數據。

默認值爲0,表示使用JDBC驅動程序的默認值。

+0

難道這仍然試圖組裝一個列表與結果集中的所有數據?我仍然無法承受這種記憶。 – 2010-02-04 13:21:05

+0

不,根據您的數據庫,它將使用適合限制結果集的子句。 (例如MySQL - limit,Oracle - rownum等) 嗯 - 我現在不確定。有了Hibernate,我知道這是可能的,但純粹的春天我不確定。 – BacMan 2010-02-04 15:22:07