2012-03-18 9 views
14

Buduję tradycyjny webapp, który wykonuje operacje bazy danych CRUD przez JDBC. I zastanawiam się, czy dobrze jest umieścić operacje jdbc na aktorów, z bieżącego wątku przetwarzania żądań. Zrobiłem trochę wyszukiwania, ale nie znalazłem żadnych tutoriali ani przykładowych aplikacji, które to demonstrują.Czy dobrze jest umieszczać operacje jdbc w aktorach?

Więc jakie są zalety i zalety? Czy asynchronizacja zwiększy wydajność aplikatora (tj. Przetworzonego żądania współbieżnego), podobnie jak nio?

Odpowiedz

12

Bez względu na to, czy wprowadzenie dostępu do JDBC przez aktorów jest "dobre", czy nie, zależy to w dużej mierze od pozostałej części aplikacji.

Większość dzisiejszych aplikacji internetowych jest synchroniczna dzięki Servlet API, która stanowi podstawę większości frameworków internetowych Java (i Scala). Podczas gdy obecnie widzimy support for asynchronous servlets, to wsparcie nie rozwinęło wszystkich frameworków. Jeśli nie rozpoczniesz z a framework that supports asynchronous processing, przetwarzanie żądania będzie synchroniczne.

Jeśli chodzi o JDBC, JDBC is synchronous. Realistycznie nigdy nie będzie nic z tym zrobić, biorąc pod uwagę obciążenia, które mogłyby mieć wpływ na modyfikację gazillion wykonania sterowników JDBC, które są na świecie. Możemy mieć nadzieję, ale nie wstrzymujmy się.

Sama implementacja JDBC nie musi być bezpieczna dla wątków, więc wywołanie operacji na połączeniu JDBC przed zakończeniem jakiejś innej operacji na tym samym połączeniu spowoduje niezdefiniowane zachowanie. I niezdefiniowane zachowanie! = Dobre.

Zgaduję więc, że nie zobaczysz takich samych ulepszeń pojemności, jakie widzisz w NIO.

Edit: Właśnie odkryto adbcj; asynchroniczny interfejs API sterownika bazy danych. To eksperymentalny projekt napisany dla pracy magisterskiej, bardzo wczesny, eksperymentalny. Jest to godny eksperyment i mam nadzieję, że się uda. Sprawdź to!

Ale, jeśli buduje, system aktor oparte na asynchroniczną, bardzo podoba mi się pomysł posiadania dostępu do danych lub repozytorium aktorów, dużo w ten sam sposób, w jaki miałoby data acccess lub repository obiektów w warstwowa Architektura OO.

Aktorzy gwarantują, że wiadomości są przetwarzane pojedynczo, co jest idealne do uzyskania dostępu do pojedynczego połączenia JDBC. (Jedno słowo ostrzeżenia: większość pul połączeń domyślnie przekazuje połączenie w wątku, co nie jest dobre w przypadku aktorów. Zamiast tego musisz się upewnić, że używasz połączenia na podmiot. do zarządzania transakcjami.)

To pozwala traktować bazę danych jak asynchroniczny system zdalny, który powinniśmy traktować jak cały czas. Oznacza to również, że wyniki z aktorów dostępu do plików/repozytoriów to futures, które są composable. Ułatwia to koordynację dostępu do danych z innymi czynnościami asynchronicznymi.

Więc, czy to dobrze? Prawdopodobnie, jeśli pasuje do architektury reszty systemu. Czy poprawi to wydajność? To zależy od twojego ogólnego systemu, ale brzmi jak bardzo godny eksperyment.

+0

To jest świetna odpowiedź, a podane materiały są bardzo pouczające. Czekałem kilka dni tylko na inne świetne pomysły. – xiefei

Powiązane problemy