PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

JDBC:Czy mogę udostępnić połączenie w aplikacji wielowątkowej i cieszyć się przyjemnymi transakcjami?

Tak, generalnie musisz utworzyć nowe połączenie dla każdego wątku. Nie masz kontroli nad tym, w jaki sposób system operacyjny ustala czas wykonywania wątków (pomimo zdefiniowania własnych sekcji krytycznych), więc możesz przypadkowo mieć wiele wątków próbujących przesłać dane przez ten jeden potok.

Pamiętaj, że to samo dotyczy każdej komunikacji sieciowej. Na przykład, jeśli masz dwa wątki próbujące współdzielić jedno gniazdo z połączeniem HTTP.

  • Wątek 1 zgłasza żądanie
  • Wątek 2 wysyła żądanie
  • Wątek 1 odczytuje bajty z gniazda, nieświadomie odczytując odpowiedź z żądania wątku 2

Jeśli umieściłeś wszystkie transakcje w krytycznych sekcjach, a tym samym zablokowałeś wszystkie inne wątki przez cały cykl rozpoczynania/zatwierdzania, możesz być w stanie udostępnić połączenie bazy danych między wątkami. Ale nie zrobiłbym tego nawet wtedy, chyba że naprawdę masz wrodzoną wiedzę na temat protokołu JDBC.

Jeśli większość twoich wątków rzadko potrzebuje połączeń z bazą danych (lub wcale nie ma takiej potrzeby), możesz wyznaczyć jeden wątek do wykonywania pracy z bazą danych, a inne wątki będą kolejkować swoje żądania do tego jednego wątku. To zmniejszyłoby obciążenie tak wielu połączeń. Ale będziesz musiał dowiedzieć się, jak zarządzać połączeniami na wątek w swoim środowisku (lub zadać inne konkretne pytanie na temat StackOverflow).

aktualizacja: Aby odpowiedzieć na twoje pytanie w komentarzu, większość marek baz danych nie obsługuje wielu jednoczesnych transakcji na jednym połączeniu (InterBase/Firebird to jedyny wyjątek, jaki znam).

Byłoby miło mieć oddzielny obiekt transakcji i móc uruchamiać i zatwierdzać wiele transakcji na połączenie. Ale sprzedawcy po prostu tego nie wspierają.

Podobnie standardowe, niezależne od dostawcy interfejsy API, takie jak JDBC i ODBC, przyjmują to samo założenie, że stan transakcji jest jedynie właściwością obiektu połączenia.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Importowanie plików z PostgreSQL do R

  2. Postgres ORDER BY wartości na liście IN przy użyciu Rails Active Record

  3. Czy należy przechowywać strefę czasową oddzielnie od sygnatury czasowej Postgres i JDBC?

  4. Błąd gniazda Postgresql podczas uruchamiania syncdb Django (mac OS 10.7.5)

  5. Migracja Django 1.8 z Postgres BDR 9.4.1