0

クレイジーに聞こえますが、ここに話があります。

バックグラウンド:

  • 私たちのDBが次のようになっていると想像してください。会社には配偶者と子供を持つn人の従業員がいます。従業員もタイヤ付きの車を持っています...など...
  • このアプリケーションは、WebUIとデスクトップUIの両方を提供します。そのため、ユーザーはデスクトップでオフラインで作業するために複数のテーブルからデータをロードしたいと考えています。例:約1000社をデスクトップにロードして作業します。
  • データ量はなんとなく大きく、数千のレコードから時には10万のレコードまでさまざまです。しかし、オフラインでロードされるデータはそれほど大きくはなく、数千にすぎません。

現在のアーキテクチャ:

  • Adobe ADEP4.6のHibernateAssemblerを使用しています。これは、DAOと非常によく似ています。たとえば、エンティティごとに1つのアセンブラーがあります。ただし、Hibernateへのアクセスは非常に制限されています。
  • Webの場合、これまでのところLAZYLoadingを使用しています。
  • AIRデスクトップについては、多くのオプションを試しています

AIRデスクトップのオプション、エンティティはすべてLAZYとしてマークされていることに注意してください。次のオプションのいずれかについて、検討しています。

  1. 名前付きhqlで「fetchjoin」を使用する:会社、従業員、車、タイヤを1つのhqlにまとめてロードする
  2. 各テーブルを個別にロードしてから、手動で一致させます。
  3. BatchSizeでEAGERFETCHを使用しますか?!! 制御が難しい
  4. Hibernateをあきらめて、巨大なJDBCクエリに戻ります。

アドバイスをお願いします。ありがとう

4

1 に答える 1

1
  1. 複数の1-N関係がある場合、返されるResultSetには非常に多くの冗長データが含まれるため、Hibernateの処理が遅すぎて私の経験では処理できません。

  2. これは、HibernateまたはプレーンSQLのいずれかを使用して行います。実際、Hibernateは、@ Fetch(FetchMode.SUBSELECT)との関係に注釈を付けることにより、ある程度これを行うことができます。たとえば、条件に基づいて一部の会社を取得する場合、次のSQLが実行されます。

    SELECT * FROM company WHERE condition
    SELECT * FROM employee WHERE employee.company_id IN (SELECT id FROM company WHERE condition)
    

    ただし、これは特定のデータベースでのみ効率的に機能することに注意してください。うまく機能しない場合は、#3を検討してください。

  3. このような場合にBatchSizeを試してみたところ、パフォーマンスがいくらか向上しましたが、オプション#2の方が優れていました。

  4. つまり、SQLの実行に要約されます。それが効率的である場合、Hibernateは通常それほど多くのオーバーヘッドを追加しません(オブジェクト作成のオーバーヘッドのみ、すべてのオブジェクトをメモリに保持するなど)

于 2012-06-20T21:24:34.420 に答える