1

休止状態がそのスキーマ メタデータを使用して HQL または必要に応じて SQL を生成する方法を知りたい特定の状況があります。

そのため、オブジェクト グラフを DB に更新する必要がある状況があります。取り決めは、null ではない (またはデフォルトではない) 値を持つフィールドのみを更新する必要があるということです。これが私の使用例です。バックエンド サポート チームが特定の製品の約 25 ~ 30 フィールドを更新できるようにする一括編集機能があります。そのため、製品 ID が提供され、列に対する値を更新する必要があります。

ただし、この場合に休止状態を使用すると、DB からビッグ オブジェクト グラフ全体を取得し、特定のフィールドを更新して、Session.merge を実行します。いいえ。編集の数が増えており、これにより CPU 使用率が上昇しており、5 倍の負荷に合わせて再設計する必要があります。

そのため、SQL クエリの生成に移り、後でバッチ更新を実行します (SQL で直接実行することを意味する場合でも)。しかし、Hibernate はすでにメタデータをスマートに使用してクエリを生成しているのではないかと思っていました。null 以外の値を持つフィールドのみをクエリ生成に含めることを許可する、ある種のインターセプターしか使用できなかった場合。

ここで大きな漠然とした質問があります: hibernate はどのようにクエリを生成しますか? 開始するのに適した場所はありますか、またはこのようなことが以前に試みられたかどうかを誰かが知っていますか.

この問題は、MySQL への CSV の一括アップロードのように見えるかもしれませんが、そうではありません。一括アップロード/編集は、主に同じテーブルのレコードの編集に関するものです。この場合、フィールドは 10 個の異なるテーブルに属しているため、関連する結合を推測する必要があります。SQLコードを生成するための汚いIF-ELSEステートメントを避けるために、休止状態を使用しようとしているだけです。

4

1 に答える 1

0

私は別のスキーマからデータ移行を行いましたが、ロード、変換/既存のレコードとのマージ、開発マシンの節約で200万レコードを処理するのに約30分かかりました。まだ改善の余地があるかもしれません

スピードアップできるもの

  • バッチで作業し、session.clear()それぞれの後に使用して、以前にキャッシュされたデータを取り除きます(そうしないと、フラッシュは時間の経過とともにより高価になります)
  • オブジェクトグラフをロードするときにプリフェッチパスを使用する
  • 多くの場合、必要なデータ(XYZType)をメモリ内にキャッシュし、それぞれの後にsession.attachをキャッシュしますclear()
  • ほとんどの時間が使用されるプロファイル
  • hibernateに適用されるかどうかはわかりませんが、NHibernateにはリフレクションオプティマイザーがあります。リフレクションの代わりにsessionfactoriesclassmetadataを使用してプロパティを設定します
  • 更新ステートメントのバッチ処理を有効にする
于 2012-05-08T08:31:31.840 に答える