3

Web ソースからスクレイピングしたデータをデータベースに同時に入力する複数のスレッドが関係する状況があります。スクレイパーは定期的に実行され、さまざまなソースから新しいデータを収集します。

私は NHibernate を使用するのが初めてで、セッションを管理する最善の方法が完全にはわかりません。

各ワーカーが行うことの例:

  • Web ソースからエンティティ A をスクレイピングする
  • A に関連する各エンティティ B をスクレイピングし、A に別の B があることを記録します (つまり、A には多くの B があり、B には 1 つの A があります)。

各 B を永続化するには、セッションで B を作成するための A への参照が必要です。次に、A は B を子のリストに追加する必要があります。その後、A と B の両方が永続化されます。

A には多くの B があり、B には多くの C があります... リーフ レベルでは、A には何千ものリーフの子があるため、セッションを維持することは非現実的 (?) です。このチェーンをずっと開いてください。

別の方法として、チェーンの各親の識別子 (セッションとは別に保存できます) を記録し、子を作成する必要があるたびに、この ID を介して親に読み込みます。

また、シングルスレッドを意図していることも理解しているISessionので、スレッドごとに少なくとも 1 つのセッションが必要ですが、これを超えると、最善のアプローチが本当にわかりませんか?

現時点では少し混乱していますが、どんなアイデアでも大歓迎です!

4

1 に答える 1

0

スレッドごとにセッションを作成し、session.Load<>()毎回オブジェクトをロードする必要なしに関連付けを維持するために使用します。

var data = GetDataForBs();

using (var session = OpenSession())
using (var tx = session.BeginTransaction())
{
    foreach (var item in data)
    {
        B = ... // create B
        B.A = session.Load<A>(data.A_Id); // Creates a proxy without loading A to maintain the association
        session.save(B);
    }
    tx.Commit();
}

各エンティティが独自に存在する場合(カスケードは必要ありません)、代わりにStatelessSessionを使用して処理を高速化できます

于 2011-12-08T08:54:32.790 に答える