0

所以我有一个在 2PC 上启动的应用程序。每个实例在服务器模式下启动一个 HSQLDB。

我试图获得不同产品的销售。

所以我查询本地数据库并用产品名称和销售数量填充一个数组列表。

然后我在另一台 PC 上的另一个数据库上执行相同的查询。

对于 1 个产品,我有两行(每行对应一个数据库)。在这里,结果是错误的,但执行时间还可以。

为了解决这个问题,我做了以下事情:

ResultSet rs2 = state2.executeQuery(produitsQuery);
while (rs2.next()) {
   for (int i = 0; i < produits.size(); i++) {
       obj = ((Object[]) produits.get(i));
       idpdt = (Integer) obj[1];

       if (idpdt == rs2.getInt(1)) {
           nb = (Integer) obj[3];
           valo = (Double) obj[4];

           nb += rs2.getDouble(4);
           valo += rs2.getDouble(5);
           produits.set(i, new Object[]{
               rs2.getString("famille"),
               rs2.getInt("id_pdt"),
               rs2.getString("nom_pdt"),
               nb,
               valo,
               s2.getString("sous_famille")});
           k = 1;
       }
    }
    if (k == 0) 
        produits.add(new Object[]{
            rs2.getString("famille"),
            rs2.getInt("id_pdt"),
            rs2.getString("nom_pdt"),
            rs2.getInt("nb"),
            rs2.getDouble("valo"),
            rs2.getString("sous_famille")});

}

结果是完美的,但执行时间非常慢,这是一个问题。我认为这是因为我在结果集的每一行循环了整个数组列表。

我可以使用哪些其他解决方案来缩短执行时间?

4

3 回答 3

2

为什么不将您的第一个结果集放入一个HashMap, 键上idpdt(因为这是您索引的内容)?HashMap 将提供 O(1) 查找,而不是 O(n)。

您的代码如下所示:

while (r2.next()) {
   Object[] result = map.get(rs2.getInt(1));
   if (result != null) {
      ...
   }
}
于 2012-10-18T14:05:15.240 回答
0

而是将数据放在一个集合中,关闭产品(或产品 ID)。然后,您从一种产品到另一种产品的查找将是 o(1),基本上只花费一个周期。如果需要对数据进行排序,您可以在运行结束时对生成的合并集进行排序,方法是将集合放入 List 并在其上使用 Collections.sort()。我认为这将大大改善两个结果集的合并。

于 2012-10-18T14:07:29.487 回答
0

如果您确定每个产品都将在两个数据库中,那么您可以ORDER BY product_id在查询中添加一个,然后同时遍历两个结果集:

while (rs1.next() &&rs2.next()) {

// your code here. No need to loop again.
// .............. 
}
于 2012-10-18T14:08:30.630 回答