3

データベースから毎日 200K の範囲のデータを削除する必要があります。私たちのアプリケーションは、Oracle DB と Hibernate ORM ツールを使用した Java/Java EE ベースです。

次のようなさまざまなオプションを検討しました

  1. 休止状態のバッチ処理
  2. ストアド プロシージャ
  3. データベースのパーティショニング

当社の DBA は、データベースのパーティション化が最善の方法であると提案しているため、パーティション化されたテーブルを毎日簡単に再作成および削除できます。問題は、毎日削除したいデータと保持したいデータの 2 種類があることです。このデータがテーブル「Trade」に格納されているとします。パーティショニングにより、2 つのテーブル "Trade" ができました。DB との間で取引をフェッチ/保存するための既存の Hibernate ベースの DAO レイヤーがあります。データベースを分割することを決定した場合、休止状態を介して 2 つのテーブルのどちらに取引を行うかを制御するにはどうすればよいでしょうか。基本的に私が望むのは、その日の終わりまでに取引を削除し、パーティション化されたテーブルに移動し、保持したい取引をメインテーブルに入れる必要があるということです。これが Hibernate でどのように可能になるかを提案してください。

私たちが間違った道を進んでいる場合に備えて、誰かがより良いアプローチを提案できれば幸いです。

4

2 に答える 2

1

データベースをパーティション化することを決定した場合、2つのテーブルのどちらが休止状態になるかをどのように制御できますか。

それがHibernateShardsの目的です。

于 2010-04-30T07:51:36.907 に答える
0

休止状態の継承戦略を使用できます。

オブジェクトの作成時にその日の終わりまでに削除されることがわかっている場合は、Trade のサブクラスである VolatileTrade を作成できます (他の属性はありません)。マッピングには「具象クラスごとのテーブル」戦略 ( hibernate 3.3 リファレンス ドキュメントのセクション 9.1.5 ) を使用します。

(私は、抽象スーパークラス Trade と、PersistentTrade と VolatileTrade の 2 つの具体的なサブクラスを実行すると思います。そのため、PersistentTrade (または Volatile) のみを参照することがわかっている他のクラスがある場合は、コードでそれを制約できます。 Trade スーパークラスを PersistentTrade として使用していた場合、それを強制することはできません。)

不安定な取引は 1 つのテーブルに移動し、「永続的な」取引は別のテーブルに移動します。

データベース内の他のテーブルからのトレード (永続的および揮発性) に fk 制約を設定できないことに注意してください。

次に、必要なときにテーブルをクリアするだけです。

ドロップおよび作成中に他のスレッドがテーブルにデータを書き込もうとしないように、ロック メカニズムを定義するように注意してください (使用する場合)。これは簡単な作業ではなく、正しく行うと、テーブルにデータを挿入するすべての操作のパフォーマンスに影響を与える可能性があります (ロックを取得する必要があるため)。

テーブルを切り捨てる方が簡単ではないでしょうか?

于 2010-05-01T19:18:37.850 に答える