1

http://code.google.com/p/struts2-jquery/source/browse/showcase-grid/src/com/jgeppert/struts2/jquery/grid/showcase/daoのフォームに似たクラス AbstractSimpleGenericDao を使用してい ます/AbstractSimpleGenericDao.java?r=322

MyDAO はこのクラスを拡張します。休止状態を維持したいオブジェクトが何千もあります。それぞれで MyDAO.save( object ) を呼び出しますか。これは私には非常に非効率的です。これにより、毎回 DB ヒットが発生しますか? 同時に多くのオブジェクトを挿入する方法はありますか?s

4

1 に答える 1

4

データベースに保存したい各アイテムで save を呼び出す必要があります。Hibernate は ORM であることを覚えておく価値があります。バッチ挿入に使用できますが、多くの場合、最も効率的な方法ではありません。

まだ読んでいない場合は、Hibernate マニュアルのこの章を読む価値があります。多数のダーティ チェックなどを回避するために、セッションを小さく保つための役立つヒントがいくつかあります。以前のオブジェクトを削除せずに数千のオブジェクトを挿入した場合、Hibernate はますます多くのオブジェクトをダーティ チェックする必要があるため、操作はますます遅くなります。

Hibernate が実際に挿入を実行する方法は、可能な限り効率的になるように設計されています。データベースの最適化を利用するために、挿入をバッチ処理できます。MySQL などの識別ベースのジェネレーターを使用すると、バッチ処理の利点が失われることに注意してください。これは、オブジェクトをセッションに挿入する時点で識別子を生成するために、Hibernate が実際に挿入を行う必要があるためです。

これを行う必要がないように、別の識別子生成戦略を実装できます。1 つの可能性は、各エンティティの現在の最高の識別子を格納するテーブルです。Hibernate は、適切なサイズのバッチでこのテーブルから識別子を要求できます。

Hibernate が遅いと感じた場合は、このタスクのためにいつでもプレーンな古い JDBC にフォールバックできます。

于 2012-09-08T02:27:44.683 に答える