5

HashMapMySQL データベースのクエリに使用されるパラメーターを取得するために、を反復処理する必要がある Java プログラムがあります。

コードは次のとおりです。

Iterator<Entry<String, Double>>it = ws.entrySet().iterator();
Connection con = null;

while(it.hasNext())  
{
    Entry<String, Double>pairs = it.next();
    PreparedStatement ps = con.prepareStatement("select doc_freq from lookup where word=?");
    ps.setString(1, pairs.getKey());
    ResultSet rs = ps.executeQuery();
}

ループの反復 (約 500 回) ごとにデータベースに繰り返しアクセスするプロセスにより、アプリケーションの速度が低下しています。データベースに一度だけアクセスできるように、これらすべてのパラメーターを一度に送信する方法はありますか?

4

3 に答える 3

1

ws がマップであることを考慮すると、次のように単一のクエリを実行できます。

Connection con = getConnection();
Set<String> ks = ws.keySet();

if (ks.size() > 0) {
    StringBuilder inStatement = new StringBuilder("?");
    for (int i = 1; i < ks.size(); i++) {
        inStatement.append(", ?");
    }

    PreparedStatement ps = con.prepareStatement("select doc_freq from lookup where word in (" + inStatement.toString() + ")");

    int k = 1;
    for (String key : keySet) {
        ps.setString(k++, key);
    }
    ResultSet rs = ps.executeQuery();
}
于 2013-04-05T19:29:44.373 に答える
0

なぜ遅いのかという質問からは明らかではありませんが、通常の問題の 1 つは、各トランザクションのオーバーヘッドです。

innodb_flush_log_at_trx_commitを 0 または 2 に設定すると、すべてが高速になります。ただし、デフォルト値の 1 が唯一の ACID 準拠の設定であることに注意してください。ほとんどのセットアップでは、2 が最適な値です。

set global innodb_flush_log_at_trx_commit = 2;
于 2013-04-05T19:27:34.893 に答える
0

ステートメントを一度準備してから、反復してパラメーターを設定してから実行します。これはjavadocからのものです

PreparedStatementIN パラメーターを使用する、または使用しない SQL ステートメントは、事前にコンパイルしてオブジェクトに格納できます。このオブジェクトを使用して、このステートメントを複数回効率的に実行できます。このメソッドは、プリコンパイルの恩恵を受けるパラメトリック SQL ステートメントを処理するために最適化されています。ドライバがプリコンパイルをサポートしている場合...

Iterator<Entry<String, Double>>it = ws.entrySet().iterator();
Connection con = getConnection();

PreparedStatement ps = con.prepareStatement("select doc_freq from lookup where word=?");
while(it.hasNext())  
{
    Entry<String, Double>pairs = it.next();
    ps.setString(1, pairs.getKey());
    ResultSet rs = ps.executeQuery();
}

クエリが db にコンパイルされると、実行が高速になり、結果を 1 つずつ取得できます。これは、複数のパラメーターを使用して 1 つのクエリを実行するのと同じです。性能は同等です。

ただし、準備する場合は、同じ SQL クエリを複数のタイプでコンパイルします。クエリをコンパイルするたびにデータベースが実行計画を作成します。これは時間の問題です。

そのため、このテクニックはドキュメントで効率的と呼ばれています。この用語は説明計画とも呼ばれ、クエリをより適切に最適化するためにデータベースによって作成されます。

于 2013-04-05T19:20:44.123 に答える