【发布时间】:2017-02-22 08:27:57
【问题描述】:
我想在哈希表中存储来自查询执行的结果集。 哈希表是这样的
Map<List<String>,List<Object>>
在哪里
List<String>, the hash table key, is a subset of the extracted fields
Object is a Java object corresponding to a database tuple (all fields)
因此,首先,必须对数据进行分组,以便创建每个键并对共享该键的所有项目进行分组。
与我目前的做法相关的伪代码是:
while(iterate){
while(rs.next){
if(key is empty)
// build REFERENCE KEY and delete rs entry
else
// build key for i-th rs entry and compare it with the REFERENCE key.
Eventually, get data and delete rs entry
}
rs.beforeFirst()
}
换句话说,结果集被迭代多次,每次创建一个新的键,以便与它比较拉曼结果集条目。每次删除处理过的条目,退出外循环。
由于结果集非常大(以及每个 List(Object) ),性能很差(每个键的加载时间非常长)。 将 order by 子句附加到查询中(以便对数据进行初步分组)并不能缓解问题。
有没有更有效的方法?
谢谢大家。
编辑
Input ResultSet
---------------------------------------------------------------
| Field1 | Field2 | Field3 | Field4 | Field5 | Field6 | Field7 |
---------------------------------------------------------------
| X | A | val1_3 | val1_4 | val1_5 | val1_6 | val1_7 |
| X | A | val2_3 | val2_4 | val2_5 | val2_6 | val2_7 |
| Y | B | val3_3 | val3_4 | val3_5 | val3_6 | val3_7 |
| Z | C | val4_3 | val4_4 | val4_5 | val4_6 | val4_7 |
| Y | D | val5_3 | val5_4 | val5_5 | val5_6 | val5_7 |
----------------------------------------------------------------
Key_Fields : [Field1, Field2]
Output Map
-----------------------------------
| KEY | VALUE |
-----------------------------------
| [X,A] | [Object1, Object2] |
| [Y,B] | [Object3] |
| [Z,C] | [Object4] |
| [Y,D] | [Object5] |
-----------------------------------
我使用List<String> 作为密钥,因为另一个ResultSet 可以有不同长度的Key_Fields。
这里是我当前耗时的 Java 代码
while(itera){
key = new ArrayList<String>();
values = new ArrayList<AbstractClass>();
while(rs.next()){
if(key.isEmpty()){
// build REFERENCE KEY
// add first OBJECT to List<AbstractClass>
// delete this data from ResultSet
}
else{
// Build KEY_TO_BE_COMPARED
List<String> row_to_be_compared = new ArrayList<String>();
// If this key equals to REFERENCE KEY
if(row_to_be_compared.equals(key)){
AbstractClass value_object = new AbstractClass();
...
rs.deleteRow();
}
// ORDERBY clause in query ensures that, if keys don't match, then all objects related to REFERENCE KEY have been collected
else{
break;
}
}
}
rs.beforeFirst();
map.put(key, values);
if(!rs.next() || items_loaded==max_hash_size)
itera = false;
else
rs.beforeFirst();
}
}
【问题讨论】:
-
为什么使用列表作为键?检查这个stackoverflow.com/questions/35560067/…
-
@Ashutosh 你认为使用
String而不是List<String>可以减少执行时间吗? -
问题是你不能使用 List
作为键,抛开执行时间。密钥必须是不可变的。 -
好的。由于
String是不可变的,因此它是一种替代方案。谢谢你的小费。关于最初的问题,有什么想法吗? -
我不完全明白你的问题。如果您可以显示一些示例值和最终输出,那么我将能够回复。如果可能,粘贴您的确切工作代码。