2012-01-25 14 views
0

私は、データベース(MySQL 5.1)のONEテーブルからHibernate経由でいくつかのデータを取り出して表示する単純なアプリケーションを持っています。使用される主なフレームワークはSpring 3.0です。 @Transactional(読み取り専用)(+第2キャッシュレベル)でクエリが正しく実行されます。 同じページに対して20/30の要求でいくつかの同時テストを実行すると問題が発生します。いくつかのページリクエストは200の代わりに500を返します。@Transactionalがマルチスレッドアクセスを管理していないためです(私が間違っているとplsを修正します)。Spring + Hibernate with multithreading environment

List<String> names = usersService.getUserNames(); // this executes query in @Transactional env 
doSomething(names); 

はログが「doSomethingのは」渡されたリスト内のデータがないとして、いくつかのNullPointerExceptionがthrewsと言う:コントローラで

私はこのような何かを持っています。

DBへの同時リクエストを管理するSpring + Hibernateでマルチスレッドアクセスマネージャを実装する方法はありますか?

+1

問題は何ですか? – axtavt

+0

申し訳ありません質問を編集しました – Randomize

+2

あなたのログが500について何を明らかにしていますか – hvgotcodes

答えて

1

@Transactionalは、マルチスレッドアプリケーションで完全に正常に動作しています。実際、すべてのWebアプリケーションはマルチスレッド化されており、各Spring Beanシングルトンインスタンスはすべての要求を処理します。だから問題はそこにはない。

エラー500が発生したら、ログファイルを確認する必要があります。何もそこになければ、あなたがいくつかの例外を飲み込んでいないことを確認してください。

+0

私は私の質問を再編集しました – Randomize

+0

私はそれがまさにそのようなものだとは思いません。 @Transactionalによって作成されたすべての接続は、同じスレッドを参照します。マルチスレッドの状況では、少なくとも@Transactionalメソッドを「同期」する必要があります。ところで、 "同期"は固定されています。 – Randomize

+1

いいえ、これは間違っています。メソッドsyncorhnizedを使用すると、アプリケーションが終了します。 – Bozho

1

着信要求ごとに個別のデータベース接続が割り当てられていることを確認する必要があります。接続はプール内で管理する必要があります。データベース接続プールのサイズは、アプリケーションが同時にサーバーに送信できる要求の数を(間接的に)決定します。

+0

私の質問を再編集しました – Randomize

+0

@Randomize:何か間違っています。コントローラはどのように実装されていますか?サーブレットやリクエストを受け取ったものはどのように呼び出されますか? – Olaf