2012-12-20 64 views
1

讓我先簡要介紹一下這個場景。數據庫是Sybase。有大約2-3 k個存儲過程。存儲過程可能會返回大量數據(約百萬條記錄)。將會有一個服務(servlet/spring controller)調用所需的過程並以xml格式將數據清回客戶端。用Java過濾/排序大量數據

我需要appy過濾(在多列&多個條件)/排序(基於一些動態標準),這一點我已經完成。

問題是,由於數據量巨大,因此在內存中進行所有過濾/排序並不好。我想到了以下選項。

選項1: 一旦我得到ResultSet對象,請閱讀一些X號。的記錄,過濾它,將其存儲在某個文件中,重複此過程直到讀取所有數據。然後,只需讀取文件並將數據刷新到客戶端即可。

我需要弄清楚如何對文件中的數據進行排序以及如何在文件中存儲對象以便過濾/排序速度很快。

選項2: 尋找一些Java的API,這需要數據,過濾它,它基於給定的標準&排序,並使其返回作爲流

選項3: 使用中 - 內存數據庫像hsqldb,h2database,但我認爲這將開銷,而不是幫助。我將需要先插入數據然後查詢數據,這也將使用文件系統。

注意我不想修改存儲過程,因此在數據庫中進行過濾/排序的選項不是選項,或者如果沒有其他方法可以作爲最後一個選項。

此外,如果它有幫助,我從ResultSet讀取的每條記錄,我將它存儲在一個Map中,鍵是列名,並且此Map存儲在List中,我將應用篩選&排序。

您認爲哪種選擇對於內存佔用空間,可擴展性,性能方面或其他任何可以滿足該場景的選項都有好處?

謝謝

+1

修改存儲過程或添加新的調用它們,將結果保存在臨時表中,然後返回臨時表的子列表 – artbristol

+1

聽起來像這樣過濾和排序是數據庫的責任。在傳輸數據之前,爲什麼不在那裏?畢竟這是數據庫的優點。正如我們在我的國家所說的那樣:這聽起來像是你想再次發明開水。 –

回答

2

我會推薦你​​的選項3但它並不需要是內存數據庫;您可以改用適當的數據庫。其他任何選項只是解決排序大量數據的一般問題的更具體的解決方案。畢竟,數據庫究竟是什麼,並且它做得很好。

如果您真的相信您的選項3不是一個好的解決方案,那麼您可以實施排序/合併解決方案。收集你的Maps,就像你已經做的一樣,但是當你達到記錄限制(比如說可能是10,000)時,把它們寫入磁盤並從內存中清除它們。

數據完成後,您現在可以打開您編寫的所有文件並對它們執行合併。

+0

嘿另一個選項,你給的是選項1 :)所以你沒有看到任何問題與選項1 –

+0

我想是的,是的 - 但將每批存儲在一個單獨的文件,並在最後一次讀所有的人。每個批次都已經排序,所以您只需要合併即可。 – OldCurmudgeon

1

hadoop適用於您的問題?

您應該過濾數據庫本身的數據。您可以編寫聚合過程,它將執行所有其他過程,合併數據或過濾它們。但最好的方法是修改2-3個存儲過程,以便僅返回所需的數據。

+0

我會檢查彙總程序,看看它是否有幫助。關於修改過程,存儲過程很複雜,過濾標準由用戶從前端形成。修改存儲過程將會發生很大的變化,因爲過濾查詢需要傳遞,並且現有的sql需求也會形成字符串,並與傳遞並執行的條件字符串連接。 –

+0

正如您在下面的評論中提到的:您可以使用臨時表來保存結果並對其進行過濾。 –

+0

數據庫是Sybase。是的,我會研究聚合過程/臨時表。 –