2010-12-04 8 views
3

私はORMについて何度も何度も尋ねられましたが、どのORMがマルチスレッド環境で動作するのが簡単かを知りたいのです。商用または無料の両方が歓迎されます。マルチスレッド化をサポートしている.NET ORM?

現在、私はDevexpressからXPOを使用していますが、マルチスレッドアプリケーションで使用するのは難しいと感じています。あるスレッドのオブジェクトを別のスレッドで共有することはできません。別のスレッドで使用するには、キーを使用してDBからオブジェクトを見つけなければなりません。本当に面倒です。オブジェクトの状態をロックしても、DBオブジェクトの状態をDBに保持することはできません。例えばオブジェクトを作成するスレッド以外のスレッドからSave()メソッドを呼び出すことはできません。

私はちょうどXPOを使い始めていますが、おそらく私は間違って使っています。

+1

あなたは問題があります。ORMのサポートに関係なく、独自のロックを実装する必要があります。 – Oded

+0

すべてのO/RMはマルチスレッド環境で使用できます。だからあなたがしようとしていることを説明してください。どのような種類のマルチスレッド環境が、どのような方法で使用されていますか。 – Steven

答えて

1

nHibernateは、多くのアプリケーションで使用されていますが、そのうちのいくつかはマルチスレッドです。

concurrency上の文書、特にセクション10.2を参照してください - それは明らかISession(あなたがこれを自分で管理する必要が)ないスレッドセーフであると述べています。

あなたが関心を持つ限り、ORMを "簡単に動作させる"ものを明確にしていただけますか?

+0

私は自分の質問を更新し、私の痛みの説明にXPOを追加しました。 – Benny

+0

ロックしても、オブジェクトはXPOで共有できません。別のスレッドからsave()を呼び出すことはできません。 – Benny

0

すべてのO/RMは、マルチスレッドアプリケーションで完全に機能します。私はLINQ to SQLとEntity FrameworkをASP.NETアプリケーション(定義ごとにマルチスレッド化されている)で使用しました。

マルチスレッド環境でO/RMを使用する際に問題が発生している場合は、間違っている可能性があります。たとえば、ほとんどのO/RMツールには、LINQ to SQLのDataContext、Entity FrameworkのObjectContext、およびXPOのSessionなど、Unit of Workパターンを実装するタイプがあります。作業単位は、1つのスレッドによって作成され、制御されることを意味します。このようにこのようなオブジェクトを使用すると、マルチスレッド環境でO/RMツールを使用しても問題はありませんでした。

+1

*すべての* O/RMがマルチスレッドアプリケーションで完璧に機能するとは言い切れません。 – cspolton

+0

@ Spolto:そうではない名前を付けてください。 – Steven

+0

Entity Framework 4.別のスレッドでオブジェクトコンテキストを十分長く使用すると、データが簡単に古くなる可能性があります。 –

0

Entity FrameworkのObjectContextはスレッドセーフではないため、共有リソースとして使用する場合は、ロックを使用して独自に実装する必要があります。

スレッドごとに新しいオブジェクトコンテキストを作成できますが、多くのスレッドが生成されたり死んでいる場合は、パフォーマンス上の問題が発生しやすくなります。

また、スレッドごとにObjectContextを設定すると、データが陳腐化する可能性があります。以下に述べるように:

最後に、もちろんマルチユーザーの同時性の問題です。 ObjectContextは、そのエンティティが処分されるまで永遠にキャッシュします。別のユーザが自分自身のObjectContextで同じエンティティを変更した場合、最初のObjectContextの所有者はその変更について決して見つけられません。これらの古くなったデータの問題は、実際にはクエリがデータベースに送られて新鮮なデータに戻ってくるのを見ることができますが、ObjectContextはそれをキャッシュに既にある古いデータで上書きします。これは私の意見では、おそらく長命のObjectContextインスタンスを避ける最も重要な理由です。データベースから最新のデータを取得するためにそれをコード化したと思っても、ObjectContextはそれがあなたよりスマートであると判断し、代わりに古いエンティティを返すようにします。あなたがスレッド間でのオブジェクトの共有を開始するたびに

Entity Framework Object Context in ASP.NET Session object?

関連する問題