15

現在、ビジネス オブジェクト、DAO オブジェクト、および Hibernate のスタックをインスタンス化する Spring アプリケーション コンテキストをロードする Web アプリケーションがあります。このスタックを別の Web アプリケーションと共有して、同じオブジェクトのインスタンスが複数になるのを回避したいと考えています。

いくつかのアプローチを検討しました。JMX または JNDI、または EJB3 を使用してオブジェクトを公開します。

さまざまなアプローチにはすべて問題があり、軽量な方法を探しています。

これを解決する方法について何か提案はありますか?

編集:少し詳しく説明するように要求するコメントを受け取ったので、ここに行きます:

解決したい主な問題は、Hibernate のインスタンスを 1 つだけにしたいということです。これは、同じデータソースで動作する複数のクライアント アプリケーションを実行しているときに、Hibernate の第 2 レベル キャッシュが無効になるという問題によるものです。また、ビジネス/DAO/Hibernate スタックはかなり大きくなっているため、複製しない方が理にかなっています。

まず、ビジネス層だけを他の Web アプリに公開する方法を調べてみました。Spring は、わずかな XML の価格で JMX ラッピングを提供します。ただし、JMX エンティティを JNDI ツリーにバインドできなかったため、Web アプリからオブジェクトを検索できませんでした。

次に、ビジネス層を直接 JNDI にバインドしてみました。Spring はこれに対するメソッドを提供していませんでしたが、JNDITemplate を使用してそれらをバインドすることも簡単でした。しかし、これによりいくつかの新しい問題が発生しました。1) セキュリティ マネージャが RMI クラスローダへのアクセスを拒否するため、JNDI リソースでメソッドを呼び出そうとすると、クライアントが失敗しました。2) セキュリティの問題が解決されると、JBoss は IllegalArgumentException: object is not an instance of declaring class. をスローしました。少し読むと、JNDI リソースのスタブ実装が必要であることがわかりますが、これは面倒なように思えます (おそらく Spring が役立つのでしょうか?)。

EJB についてはまだ詳しく調べていませんが、最初の 2 回の試行の後、私たちが達成しようとしていることが本当に可能かどうか疑問に思っています。

私たちが達成しようとしていることを要約すると、1 つの JBoss インスタンス、DAO レイヤーと Hibernate の上でビジネス オブジェクトの 1 つのスタックを利用する複数の Web アプリです。

よろしくお願いします、

ニルス

4

9 に答える 9

5

Web アプリケーションは同じサーバーにデプロイされていますか?

Spring について話すことはできませんが、Session Bean を使用してビジネス ロジックを EJB 層に移動するのは簡単です。

アプリケーションの構成は簡単です。ロジックはセッション Bean に入り、これらのセッション Bean は、ejb-jar.xml ファイルを含む Java EE アーティファクトとして単一の jar 内にバンドルされます (EJB3 では、これは実質的に空になる可能性があります)。

次に、Entity クラスを別の jar ファイルにバンドルします。

次に、各 Web アプリを独自の WAR ファイルにビルドします。

最後に、すべての jar と war が、関連付けられた application.xml ファイルとともに Java EE EAR にバンドルされます (ここでも、EAR 内の jar を単に列挙するだけで、これは非常に最小限になる可能性があります)。

この EAR は、アプリ サーバーにホールセールでデプロイされます。

各 WAR は事実上独立しています。独自のセッション、独自のコンテキスト パスなどがあります。ただし、共通の EJB バックエンドを共有するため、第 2 レベルのキャッシュは 1 つしかありません。

また、EJB は同じサーバーにあるため、ローカル参照と呼び出しセマンティックを使用して EJB と通信します。ここではリモート通話は必要ありません。

これはあなたが抱えている問題を非常にうまく解決すると思います.EJB 3を使用したJava EE 5では非常に簡単です.

また、私が理解しているように、Spring を多くの作業に引き続き使用できますが、私は Spring の人ではないため、詳細について話すことはできません。

于 2008-11-06T15:40:38.013 に答える
3

ここではTerracottaが適しているかもしれません (開示: 私は Terracotta の開発者です)。Terracotta は、Java オブジェクトを JVM レベルで透過的にクラスター化し、Spring と Hibernate の両方と統合します。無料でオープンソースです。

あなたが言ったように、L2 キャッシュを使用する複数のクライアント Web アプリの問題は、それらのキャッシュの同期を維持することです。Terracotta を使用すると、単一の Hibernate L2 キャッシュをクラスター化できます。各クライアント ノードはそのクラスター化されたキャッシュのコピーを使用して動作し、Terracotta は同期を維持します。 このリンクで詳細が説明されています。

ビジネス オブジェクトに関しては、Terracotta のSpring 統合を使用して Bean をクラスター化できます。各 Web アプリはクラスター化された Bean インスタンスを共有でき、Terracotta はクラスター化された状態を透過的に同期します。

于 2008-11-06T16:44:38.040 に答える
2

Terracotta Reference WebApplication-Examinetorをご覧ください。探しているコンポーネントのほとんどが含まれています。Hibernate、JPA、およびMySQLバックエンドを備えたSpringがあります。

最大16ノード、2万人の同時ユーザーにスケールアップするように事前に調整されています。

ここでそれをチェックしてください:http://reference.terracotta.org/examinator

于 2008-12-02T21:11:23.340 に答える
2

実際、軽量のソリューションが必要で、トランザクションやクラスタリングが不要な場合は、RMI の Spring サポートを使用してください。最新バージョンの単純なアノテーションを使用して、Spring Bean をリモートで公開できます。http://static.springframework.org/spring/docs/2.0.x/reference/remoting.htmlを参照してください。

于 2008-11-07T21:02:14.967 に答える
1

これまでのご回答ありがとうございます。私たちはまだそこに到達していませんが、いくつかのことを試してみて、物事がより明確に見えるようになりました. ここに短い更新があります:

最も実行可能と思われるソリューションは EJB です。ただし、これにはコードに多少の変更が必要になるため、現時点ではそのソリューションを完全に実装するつもりはありません。ここで役立つ Spring 機能が見つからないことに、ほとんど驚いています。

また、JNDI ルートも試しました。これは、すべての共有インターフェイスのスタブが必要になることで終わります。とにかくすべてが同じサーバー上にあることを考えると、これは非常に面倒なように感じます.

昨日、JMX で小さなブレークスルーがありました。JMX は間違いなくこの種の使用を意図していませんが、コードを変更せず、最小限の XML で実行できることを証明しました (MBeanExporter と MBeanProxyFactoryBean について Spring に感謝します)。この方法の主な欠点は、パフォーマンスと、JBoss の server/lib フォルダーを介してドメイン クラスを共有する必要があるという事実です。つまり、WAR からいくつかの依存関係を削除し、server/lib に移動する必要があります。そうしないと、ビジネス レイヤーが独自のドメイン モデルからオブジェクトを返すときに ClassCastException が発生します。これが起こる理由は完全に理解していますが、私たちが達成しようとしているものには理想的ではありません.

最善の解決策と思われるものを実装するには時間がかかるため、少し更新する時が来たと思いました。その作業が完了したら、調査結果をここに投稿します。

于 2008-11-11T07:50:47.633 に答える
0

何を解決しようとしているのかよくわかりません。最終的に、各 jvm は、オブジェクトの複製されたインスタンス、または別の (論理) サーバーに存在するオブジェクトを表すスタブのいずれかになります。

2 つの Web アプリが呼び出すことができるリモート API を持つ 3 番目の「ビジネス ロジック」サーバーをセットアップできます。典型的な解決策は EJB を使用することですが、Spring にはスタックにリモート オプションが組み込まれていると思います。

もう 1 つのオプションは、何らかの形式の共有キャッシュ アーキテクチャを使用することです。これにより、サーバー間でオブジェクトの変更が同期されますが、インスタンスのセットは 2 つあります。

于 2008-11-06T18:44:00.390 に答える
-1

JBossCacheを見てください。複数の JVM インスタンス (同じボックスまたは別のボックス) 間でデータのマップを簡単に共有/複製できます。使いやすく、多くのワイヤ レベル プロトコル オプション (TCP、UDP マルチキャストなど) があります。

于 2008-11-06T15:29:11.203 に答える