0

エントリがすでに存在する場合にのみ、エントリをテーブルに保存しています。

public static Email getOrCreate(Session sess, String address) {
    if (address==null) return null;
    List l = sess.createQuery("SELECT email FROM Email email WHERE email.address=:address").setString("address", address).list();
    if (l.size() > 0)
        return (Email) l.get(0);
    Email email = new Email(address);
    sess.save(email);
    return email;
}

私はこの手順の速度に満足していません。5000の複雑なレコードを保存するのに約5分かかり、時間の50%がこの関数で占められています。私の休止状態のキャッシュ設定は次のとおりです。cfg.setProperty( "hibernate.cache.provider_class"、 "org.hibernate.cache.EhCacheProvider");

もちろん、静的マップを作成してデータベースと同期することもできますが、少し見苦しいです。冬眠はこのようなことをすることができますか?ありがとう。

4

1 に答える 1

1

バッチで行う:

Set<String> addresses = ...;
List<String> existingAddresses = 
    session.createQuery("select email.address from Email email where email.address in :addresses")
           .setParameterList("addresses", addresses)
           .list();
addresses.removeAll(existingAddresses);
for (String address : addresses) {
    session.save(new Email(address));
}

INただし、データベースで 1 つの句に 5000 個の要素が許可されていることを確認してください。たとえば、Oracle はそれらを 1000 に制限しています。ただし、5000 ではなく 5 つのリクエストしか実行できませんでした。

とは言っても、これを行うのに 5 分という時間は、私にはかなりの時間のように思えます。email.address にデータベース インデックスが定義されていますか?

于 2012-11-24T11:39:20.900 に答える