1

問題の解決策を設計する必要があります。だから、助けてください。

私の問題 :

1 つの Web プロジェクトがあります。そこでは、A、B、C、D という名前の 4 つのテーブルを使用しています。テーブルごとに 1 つのフロントエンド ページを作成し、レコードをそれぞれのテーブルに保存するためのボタンを用意しました。ここで、Web サービス統合を使用して、この各レコード データを別のアプリケーションと共有する必要があります。JAX-WS Web サービスに関する知識があります。

必須フィールドを特定し、4 つのテーブルすべてに共通の WSDL を 1 つだけ作成しました。ユーザーがレコードを保存しようとすると、その時点で Web サービス呼び出しを発生させる必要があるだけです。(イベント ベース) ここでは、同期 Web サービスを停止しています。つまり、すべての要求に対して、システムは相手側からの応答を待ちます。

まず、テーブル A にレコードを保存しようとしているとします。そのため、フォーム A のすべての必須フィールドに入力し、保存ボタンを押しようとしています。レコードをデータベースに保存し、Web サービス リクエストを相手側に送信し、サーバーにレコードを送信して応答を待機している.....この間に、同じフォーム A の別のレコードを送信しようとしている場合 (または) フォーム B の新しいレコード。

次に、この種のシナリオを処理する方法は、スレッドが応答のためにサーバーで既にビジー状態になっているためです。したがって、同期的に行うように複数のリクエストを同時に発生させる方法。

私が適用できる可能な解決策を提案してください。提案は私にとって非常に役立ちます。

(下手な英語でごめんなさい)

4

1 に答える 1

1

あなたのシナリオを見ると、次のようなものがあることがわかります。

データベース -> Web JAX-WS サーバー -> 複数の JAX-WS クライアント

クライアントから WS サーバーを呼び出すと、要求を処理し、すべてのクライアントの応答を処理するために、新しいスレッドが作成されます。Web サーバーは「マルチスレッド」であり、同時に呼び出す複数のクライアントをサポートします。あなたの問題は、おそらく WS サービスの後です。

WS を使用して 2 つのクライアントで同じテーブルを読み取ろうとしている場合、問題はありませんが、1 つのクライアントが他の読み取りまたは 2 つ以上のクライアントがテーブルを更新しているときに保存しようとすると、おそらくトランザクション ロックが問題になります。

データベースの構成によっては、トランザクション分離オプションを構成し、絶対に必要な場合にのみトランザクションを開いたり閉じたりするデータベース接続を慎重に処理する必要があります。

たとえば、InnDB ( http://dev.mysql.com/doc/refman/5.0/es/innodb-transaction-isolation.html ) で MySQL を使用していて、クエリを実行するときにトランザクション分離が「SERIALIZABLE」である場合テーブルはトランザクションが終了するまでロックされ、他のクライアントはトランザクションが解放されるかタイムアウトが発生するまで待機します。

ただし、「REPEATABLE READ」を使用すると、あるトランザクションによって読み取られたレコードのみが他のトランザクションにロックされます。これは一部の環境では「良い」場合がありますが、同じ行に適用される 2 つの SQL 文はおそらくデッド ロックを引き起こします。* MySQL InDB のデフォルト

また、READ COMMITED または READ UNCOMMITED を使用して、すべてのテーブルを読み取り、さまざまなレコードを変更できるようにする必要があります。また、最小限の問題で同じレコードを処理することを常にお勧めします: 「最小限の必要な時間だけトランザクションを開く」


2 番目の要求を作成するときに最初の要求を破棄するシングルトン パターンがないか、WS クライアントを確認してください。また、状態を指定して WS を使用しているかどうか、異なる要求に対して同じであるユーザー セッション内のセッションまたは別のサーバー側オブジェクトを保持しているかどうかも確認してください。

Stateles に関連するもの:

1 つの EJB 3 Bean で @WebService、@Stateless、および @Singleton を一緒に使用することは可能ですか?

于 2013-09-13T12:14:39.560 に答える