Ponieważ nie otrzymałem odpowiedzi, zacząłem robić testy porównawcze. Moje kryteria są następujące:
- 20 000 wstępnie wygenerowanych kodów
- Korzystanie z Apache
ab
polecenie z 20 000 żądań, 100 współbieżności:ab -n 20000 -c 100
- Servlet -> EJB (JPA 2.0 EclipseLink, JTA) do wykonania aktualizacji w DB (tak jak będzie poprzez akcję JSF w rzeczywistej sytuacji)
- 2 wersje serwletu, jedna z opcją 1 (SELECT ... FOR UPDATE ) i jedna z opcją 2 (UPDATE ... LIMIT 1)
- Zatrzymano Glassfish, wciśnij testowany Servlet ręcznie 5 razy, aby go rozgrzać, zresetuj wszystko do wartości NULL na user_id
- Testy są przeprowadzane 3 razy i podana jest średnia
Wyniki:
WYBIERZ... DO AKTUALIZACJI; AKTUALIZACJA... :
Concurrency Level: 100
Time taken for tests: 758.116 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
AKTUALIZACJA.... LIMIT 1:
Concurrency Level: 100
Time taken for tests: 773.659 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Row updated: 20000
Tak więc przynajmniej w moim systemie opcja z 2 zapytaniami wydaje się bardziej wydajna niż jedno zapytanie. Nie spodziewałem się tego :)