datanucleus の PMF がスレッドセーフかどうか知っていますか? 次の問題が
あります。メソッド呼び出し用に 1 つ、複数の PersistenceManagers を作成する 1 つの PMF があります。PMF は、スレッドとメソッドの間で共有されます。
アプリケーションをシングル スレッドで実行している場合は問題ありませんが、アプリケーションを Tomcat ストレス テストにデプロイした場合、一部の状況で持続性マネージャーが同時の getObjectById 呼び出しにスタックすることが示されました。
非トランザクション読み取りがオンになっているため、これはロックの問題ではありません。マルチスレッド フラグも true に設定されました。
毎回新しい PMF を作成すると、問題はなくなりました。しかし、このソリューションは高価です。より良い解決策についてのアイデアはありますか?
1 に答える
1
JDO仕様が非常に明確に述べているように、PMFはスレッドセーフです。PM はスレッドセーフではなく、DataNucleus のすべてのドキュメントでは、リクエストごとに 1 つの PM を推奨しています。あなた (あなた) はリクエストごとに 1 つの PM を持っているので、PM は別の PM と何も共有しないため、ロックされる可能性はありません。
ブロッキングがあると言う場合は、2 つの PM がどのように相互にロックしているかを示すスレッド ダンプを簡単に提供できます。これにより、何が、何を、なぜブロックしているかが示されます。可能性 ... L2 キャッシュ、ストア マネージャー (データストア)。明らかに、最近のリリースを使用することは、そのすべてに意味があります
于 2012-05-29T18:33:54.983 に答える