0

だから私は2PCで起動するアプリケーションを持っています。各インスタンスは、サーバー モードで HSQLDB を起動します。

さまざまな商品の売上を上げようとしています。

そこで、ローカル データベースにクエリを実行し、arraylist に製品名と販売数を入力します。

次に、別の PC 上の別のデータベースに対して同じクエリを実行します。

1 つの製品に対して、2 つの行があります (それぞれが 1 つのデータベースに対応しています)。ここでは、結果は false ですが、実行時間は問題ありません。

それを管理するために、次のことを行いました。

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(n) ではなく O(1) ルックアップを提供します。

コードは次のようになります。

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

代わりに、データをセットに入れ、製品(または製品ID)をキーオフします。次に、ある製品から別の製品へのルックアップはo(1)になり、基本的に1サイクルしかかかりません。データを並べ替える必要がある場合は、実行の最後に結果のマージされたセットをリストに入れ、Collections.sort()を使用して並べ替えることができます。これにより、2つの結果セットのマージが大幅に改善されると思います。

于 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 に答える