我存储从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数据库表永远不会增长。即使您可以使存储稍微更高效,字符串也很大。你最终会耗尽内存。 –