2012-04-03 1 views
0

まず、これはおそらく既製ですか?Hibernateの 'session.flush'でのマルチスレッディング

Hibernate 3.6、JDBC batch_size 500、 200.000エンティティ上のHiloジェネレータを使用します。

私の例では、56秒かかるリクエストがあり、セッションで200,000のエンティティを作成しています。したがって、session.flush()コマンドは、%100に1つのCPUコアしかない56秒間に32秒かかる。

更新が必要なエンティティのリストを取得し、SQLステートメントを作成する方法はありますか。たとえば、4つのスレッドですか?

答えて

1

flush()は、基本的にすべての保留中のSQL INSERTステートメントを基本接続を使用してデータベースに送信しているため、異なるスレッドではflush()とすることはできません。 JDBC接続はスレッドセーフではありません。つまり、4つの異なる接続と4つの異なるトランザクションを使用する必要があります。 1つのトランザクションですべての挿入が必要な場合は、ここで行うことはできません。

4つの別々のトランザクションで暮らすことができる場合は、スレッドプールを作成し、レコードを小さなバッチで保存してください。プールは複数のスレッドにまたがってINSERT操作を配布します。

また、これが本当に役に立ちますか?私はflush()がCPUバインドではなく、I/Oまたはネットワークにバインドされていると思います。しかし、あなたの経験は100%の使用とは違うので、私は間違っているかもしれません。また、ステートレスセッション、生のJDBC /ネイティブクエリ、バッチ挿入などを使用してINSERTを最適化してみてください。別々のスレッドに分割する方がはるかに難しいです。

+0

私はちょうどsession.flushコマンドの前後に32秒かかります。そして、これまでのところstackoverflowを検索していた限り、flushはSQL文が作成される場所ですか、またはそれらがすべてmySQL側のトランザクションに送信されるコマンドですか? – kommradHomer

+0

@kommradHomer: 'flush()中に' SQL文が生成され**、**がデータベースサーバに送信されます。 SQLの作成にはほんの数分しかかかりません。実際のオーバーヘッドはデータを転送し、結果(データベース側)を待つことです。 –

+0

と私はローカルホスト上でこのテストを行うことを考えて、そのすべてについてのMySQLの – kommradHomer

関連する問題