答えが得られなかったので、ベンチマークを始めました。私の基準は次のとおりです:
- 20,000個の事前生成されたコード
- Apache
ab
の使用 20,000リクエスト、100同時実行のコマンド:ab -n 20000 -c 100
- サーブレット->EJB(JPA 2.0 EclipseLink、JTA)を使用して、DBで更新を実行します(実際の状況ではJSFアクションを介して実行されるため)
- サーブレットの2つのバージョン。1つはオプション1(SELECT ... FOR UPDATE)、もう1つはオプション2(UPDATE ... LIMIT 1)
- Glassfishを停止し、テストしたサーブレットを手動で5回ヒットしてウォームアップし、すべてをNULLにリセットしてuser_idにします
- テストはそれぞれ3回実行され、平均が提供されます
結果:
SELECT ... FOR UPDATE;更新...:
Concurrency Level: 100
Time taken for tests: 758.116 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
更新....制限1:
Concurrency Level: 100
Time taken for tests: 773.659 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
したがって、少なくとも私のシステムでは、2つのクエリを使用するオプションの方が1つのクエリよりも効率的であるように思われます。私はそれを予期していませんでした:)