我存儲從SQL查詢結果的Arraylist<Hashtable<String, String>>
,每個結果都存儲在一個Hashtable中,然後將每個結果存儲在列表上最佳SQL查詢結果存儲
它工作得很好,如果有少比100.000的結果,buf如果有更多的結果我得到和OutOfMemory異常。
對於如何改善這種情況,您有任何建議嗎?
我存儲從SQL查詢結果的Arraylist<Hashtable<String, String>>
,每個結果都存儲在一個Hashtable中,然後將每個結果存儲在列表上最佳SQL查詢結果存儲
它工作得很好,如果有少比100.000的結果,buf如果有更多的結果我得到和OutOfMemory異常。
對於如何改善這種情況,您有任何建議嗎?
有幾種不同的方法。 Stechen C是正確的,最好在SQL中使用'where'子句來減小結果集的大小。
如果您使用緩存,則可以爲緩存設置最大大小,並且最好使用LinkedHashMap。有一個Map的實現來保持插入順序。你需要它的子類,並覆蓋removeEldestEntry()方法,如在Javadoc指出:
改善這種最簡單的,可能至少內存密集型的方式是保持一個二維數組爲您的數據:
String[][] data;
// Alternatively, if you prefer lists:
List<String[]> data;
你會那麼只需要一個額外的數據結構,如
Map<String, Integer> fieldNameToIndexMapping;
...在這裏你會第一建立一個查找表,通過列索引訪問您的字段。例如。
String value = data[row][fieldNameToIndexMapping.get("MY_COLUMN")];
在適當的情況下,可以使用更簡潔的數據類型進行更多調整。我懷疑你存儲在你的數據結構中的一些String
值實際上是Boolean
,Integer
以及其他更容易以非字符串形式存儲的項目。
你是否真的需要一次完成所有的結果?賠率是你可以存儲一個有限的數字,當你真正需要時用另一個查詢拉出更多。否則通常只是浪費記憶。 –
是的,我這樣做,因爲我正在從JDBC數據庫表中獲取信息並將其存儲在MongoDB中,所以我需要存儲所有信息 – RedEagle
我很困惑 - 爲什麼你不能將它作爲一個多層應用程序來執行?步驟過程?如果你真的在使用另一個數據庫上的INSERT查詢執行SELECT查詢,那麼這是將它分開的最佳人選。無論如何,你不可避免地要做這樣的事情,除非JDBC數據庫表永遠不會增長。即使您可以使存儲稍微更高效,字符串也很大。你最終會耗盡內存。 –