2

Hibernate によってマップされたクライアント テーブルと 1 対 1 の関係を持つ多くのテーブルがあります。

スレッドを使用してこれらの各テーブルを選択した後、一意のクライアントのファイルを作成する必要があります。

これらの各テーブル (請求書、サービスなど) もファイルに含まれますが、クライアントのリストの後に含まれます (政府の要件、理由は聞かないでください...)。

これを行うには、次の 3 つの方法を考えました。

方法 1: HashSet を使用する

選択するたびに Client オブジェクトを HashSet に追加します。残念ながら、このソリューションはスケーラブルではありません。テーブル B には何百万もの一意のレコードが含まれる可能性があり、OutOfMemory エラーが発生する可能性があります。

方法 2: ビューを使用する

テーブルを結合するビューを作成することもできます。問題は、これらの選択には多くの複雑なルールがあり、頻繁に変更されることです。プログラムとビューを変更する必要があるため、メンテナンスは悪夢です。

方法 3: 一時テーブルを使用する

各テーブルで見つかった Client オブジェクトを格納する一時テーブルを作成し、そのテーブルで選択を実行できます。

これまでのところ、方法 3 が最善の解決策のようですが、これを行うためのより良い方法があるかどうか疑問に思っていました。どうすればデザインを改善できますか?

4

1 に答える 1

0

私は間違った視点で問題を見ていました。

データベースを選択し、各スレッドで異なるファイル (つまり、請求書用、サービス用など) を作成し、すべてのファイルを 1 つのファイルに結合することに固執しました。もちろん、これは 1 つの解決策ですが、上記の問題が発生します。

これを行う 2 つ目の方法は、最初にデータベース上のレコード (スレッドとすべて) を選択することです。次に、テンプレート エンジン (FreeMarker、Chunk... など) またはカスタム フォーマッタを使用してファイルを作成できます。

スレッドでこれを行う方法はたくさんあります (run() メソッドは void を返しますが):

  • ExecutorService を FutureTask と共に使用して、モデルのリストを取得します。
  • モデルを保持するために、同期されたメソッドで静的オブジェクトを使用します。
  • 依存性注入を使用して、このオブジェクトを Runnable オブジェクトに注入し、シングルトンにします。
于 2013-04-04T19:50:24.007 に答える