0

Hibernate を介して db (MySQL 5.1) の 1 つのテーブルからデータを取得し、コンテンツを表示する単純なアプリケーションがあります。使用される主なフレームワークは Spring 3.0 です。クエリは @Transactional(read-only) (+second cache level) で正しく実行されます。同じページに対して 20/30 リクエストを使用していくつかの同時テストを実行すると、問題が発生します。一部のページ要求は、200 ではなく 500 を返します。これは、@Transactional がマルチスレッド アクセスを管理していないためだと思います (間違っている場合は修正してください)。

コントローラーには、次のようなものがあります。

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

ログには、渡されたリストにデータがないため、「doSomething」が NullPointerException をスローしたことが示されています。

db への同時要求を管理する Spring+Hibernate を使用してマルチスレッド アクセス マネージャーを実装する方法はありますか?

4

2 に答える 2

1

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

于 2012-01-25T21:03:54.183 に答える
1

@Transactional は、マルチスレッド アプリケーションで完全に正常に動作します。実際、すべての Web アプリケーションはマルチスレッド化されており、各 Spring Bean シングルトン インスタンスがすべてのリクエストを処理します。したがって、問題はそこにはありません。

エラー 500 が発生した場合は、ログ ファイルを確認する必要があります。何もない場合は、例外を飲み込んでいないことを確認してください。

于 2012-01-25T22:45:54.897 に答える