Da ich keine Antwort bekam, fing ich an Benchmarking zu machen. Meine Kriterien sind wie folgt:
- 20.000 vorgenerierte Codes
- Verwendung von Apache
ab
Befehl mit 20.000 Anfragen, 100 Parallelität:ab -n 20000 -c 100
- Servlet -> EJB (JPA 2.0 EclipseLink, JTA), um die Aktualisierung in der DB durchzuführen (wie es in der realen Situation durch eine JSF-Aktion geschehen wird)
- 2 Versionen des Servlets, eine mit Option 1 (SELECT ... FOR UPDATE ) und eine mit Option 2 (UPDATE ... LIMIT 1)
- Glassfish gestoppt, das getestete Servlet 5 Mal manuell angefahren, um es aufzuwärmen, alles auf NULL auf user_id zurückgesetzt
- Die Tests werden jeweils dreimal durchgeführt und der Durchschnitt wird angegeben
Ergebnisse:
... FÜR AKTUALISIERUNG AUSWÄHLEN; AKTUALISIEREN ... :
Concurrency Level: 100
Time taken for tests: 758.116 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
AKTUALISIEREN.... GRENZE 1:
Concurrency Level: 100
Time taken for tests: 773.659 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
Zumindest auf meinem System scheint also die Option mit 2 Abfragen effizienter zu sein als die eine Abfrage. Damit hatte ich nicht gerechnet :)