4

spring、jdbc、および aop を使用し、m 個のパッケージに n 個のクラスがあり、すべてがデータベース トランザクションに参加している、トランザクション対応のマルチスレッド Java アプリケーションを想像してみてください。ここで、1 つのトランザクション内で任意のクラス セットのスコープを設定する必要があるとします。さらに、スコープ内には、呼び出されたときにトランザクションをコミットするクラス T が常に 1 つあります。

明確にするために例を挙げましょう: パッケージ A、B、Z およびクラス A.Foo、B.Bar、ZT を考えると、それぞれのクラスの次のインスタンスが呼び出されます (おそらく、その間に他のクラスを持つ異なる呼び出し元によって): A. Foo,B.Bar,A.Foo,ZT トランザクションは、ZT が呼び出された後にのみコミットされます。何らかの理由でアプリケーションがシャットダウンした場合、ZT が関与しない限り、トランザクションは決してコミットされません。

インスタンスは互いに呼び出すことができ、既に述べたように、単一のエントリ ポイント (サービス レイヤーなど) からすべてのインスタンスを呼び出す共通のエントリ ポイントはなく、Spring のトランザクション タグの簡単なターゲットになります。

ここで質問です:この問題はアスペクトを使用して解決できますか? もしそうなら、基本的なアプローチは何ですか?ありがとう。

4

3 に答える 3

2

Spring のイディオムでは、作業単位を認識するサービス インターフェイスと、リレーショナル データベースを処理する永続インターフェイスを用意することを推奨しています。サービス インターフェイスのメソッドは、ユース ケースに密接に対応している必要があります。サービスの実装は、ユース ケースの目標を達成するために必要なすべてのモデルと永続化のパッケージとクラスを認識しています。

「インスタンスは互いに呼び出すことができ、すでに述べたように、単一のエントリ ポイント (サービス レイヤーなど) からすべてのインスタンスを呼び出す共通のエントリ ポイントはなく、Spring のトランザクション タグの簡単なターゲットになります。」

この文は、Spring のイディオムにそう簡単に当てはまらない方法で物事を行っていることを示しています。何が必要かを正確に伝えるのは難しいですが、Spring が推奨する最も重要な 2 つのレイヤーを脇に置いているように思えます。木目に逆らうのが難しいと思われる場合は、再加工が必要なデザインである可能性があります。

「...その間に他のクラスがある異なる呼び出し元...」-これらの呼び出し元でトランザクションを個別に宣言する必要があるかもしれません。

Spring AOP または AspectJ のいずれかを使用して、アスペクトを使用して XML 構成でトランザクションを宣言できます。Spring 2.5 以降では、XML 構成よりもアノテーションを使用したい場合に、アノテーションを使用するオプションが提供されるようになりました。

あなたの説明は私をひどく混乱させます。多分それはあなたがそれに苦労している理由の一部でもあります. 再考または明確にします。

于 2009-06-16T00:54:38.107 に答える