2012-05-10 20 views
5

Pracuję z Oracle i MySQL, a ja staram się zrozumieć, dlaczego API nie są napisane tak, że mogę zadzwonić, odejść i zrobić coś innego, a następnie wrócić i odebrać go później np. NIO - jestem zmuszony poświęcić wątek oczekiwaniu na dane. Wygląda na to, że interfejsy SQL są jedynym miejscem, w którym synchronizacja IO wciąż jest wymuszona, co oznacza związanie wątku czekającego na DB.Dlaczego główni dostawcy DB nie dostarczają prawdziwie asynchronicznych interfejsów API?

Czy ktoś może wyjaśnić powody tego? Czy jest coś fundamentalnego, co sprawia, że ​​jest to trudne?

Byłoby wspaniale móc używać 1-2 wątków do zarządzania moim problemem zapytań DB i pobierania wyników, zamiast używać wątków roboczych do pobierania danych.

Zauważam, że są dwie próby eksperymentalne (np. Adbcj) przy implementacji async API, ale żaden nie wydaje się być gotowy do użycia w produkcji.

+0

Ja też byłem tym zaskoczony. –

Odpowiedz

1

Serwery baz danych powinny obsługiwać tysiące klientów. Aby zapewnić asynchroniczny interfejs, serwer DB będzie musiał utrzymywać zestaw wyników z zapytania w pamięci, aby można było go pobrać na późniejszym etapie. Szybko straci zasoby.

+1

Widzę twoją sprawę, do pewnego stopnia - chociaż tak i tak musi się stać; pobieranie dużych wyników zwykle nie powoduje odzyskania całego zestawu wyników za jednym razem. – jasonk

1

Poważnym problemem związanym z asynchronią jest wiele bibliotek używających wątkowych powiązań dla transakcji.

Na przykład w Javie Większość specyfikacji JDBC opiera się na synchronicznym zachowaniu w celu uzyskania pojedynczego wątku na transakcję. To ty piszesz transakcję w porządku proceduralnym.

Aby to zrobić, właściwe transakcje muszą zostać wykonane za pomocą oddzwaniania, ale nie są. Znam tylko plik node.js, który robi to, ale jest niejasny, jeśli jest naprawdę asynchroniczny.

Oczywiście, nawet jeśli robisz asynchronię, nie jestem pewien, czy to naprawdę poprawi wydajność, jak sama baza danych, jeśli prawdopodobnie robi to synchronicznie.

Istnieje wiele sposobów, aby uniknąć wątku przeludnieniem w (Java): Is asynchronous jdbc call possible?

Osobiście obejść ten problem Używam Message Bus jak RabbitMQ.

Powiązane problemy