Czy ktoś może podać przykłady lub linki dotyczące sposobu ustanawiania puli połączeń JDBC?
Z wyszukiwania w Google widzę wiele różnych sposobów na zrobienie tego i jest to raczej mylące.
Ostatecznie potrzebuję kodu, aby zwrócić java.sql.Connection
obiekt, ale mam problem z rozpoczęciem ... mile widziane sugestie.
Aktualizacja: nie ma javax.sql
lub nie java.sql
ma implementacji połączeń w puli? Dlaczego nie byłoby najlepiej ich używać?
Odpowiedzi:
Jeśli potrzebujesz puli połączeń autonomicznego, moja preferencja idzie C3P0 nad DBCP (to już wspomniano w tej poprzedniej odpowiedzi ), po prostu miał zbyt wiele problemów z DBCP pod dużym obciążeniem. Korzystanie z C3P0 jest banalnie proste. Z dokumentacji :
Ale jeśli pracujesz na serwerze aplikacji, zalecałbym użycie wbudowanej puli połączeń, którą zapewnia. W takim przypadku musisz go skonfigurować (zapoznaj się z dokumentacją serwera aplikacji) i pobrać źródło danych za pośrednictwem JNDI:
źródło
Zwykle, jeśli potrzebujesz puli połączeń, piszesz aplikację, która działa w jakimś zarządzanym środowisku, to znaczy na serwerze aplikacji. W takim przypadku przed wypróbowaniem innych opcji należy sprawdzić, jakie funkcje buforowania połączeń zapewnia serwer aplikacji .
Gotowe rozwiązanie będzie najlepiej zintegrowane z pozostałymi serwerami aplikacji. Jeśli jednak nie korzystasz z serwera aplikacji, polecam komponent Apache Commons DBCP . Jest szeroko stosowany i zapewnia wszystkie podstawowe funkcje tworzenia pul, których wymaga większość aplikacji.
źródło
HikariCP
Jest nowoczesny, szybki, prosty. Używam go do każdego nowego projektu. Wolę to dużo od C3P0, nie znam zbyt dobrze innych pul.
źródło
Nie odkrywaj na nowo koła.
Wypróbuj jeden z łatwo dostępnych komponentów innych firm:
Apache DBCP zawiera inny przykład, jak skonfigurować buforowanie javax.sql.DataSource . Oto jedna próbka, która pomoże Ci zacząć.
źródło
disclecsia
dostałem mnie lepiej. Widać, że link jest poprawny. :)tomcat-jdbc
. Możesz go pobrać z Maven Central ->org.apache.tomcat:tomcat-jdbc:jar:7.0.22
-> search.maven.org/…Polecam korzystanie z biblioteki commons-dbcp . Istnieje wiele przykładów, jak go używać, tutaj jest link do prostego przenoszenia . Użycie jest bardzo proste:
Wystarczy tylko raz utworzyć źródło danych, więc jeśli nie wiesz, jak to zrobić, przeczytaj dokumentację. Jeśli nie wiesz, jak poprawnie pisać instrukcje JDBC, aby nie wyciekać zasobów, możesz również przeczytać tę stronę Wikipedii .
źródło
javax.sql.DataSource
definicji interfejsu zawiera implementację „Pule połączeń„(poza tym, myślę, że już wie, co to jest interfejs JDBC).Na serwerze aplikacji, którego używamy, w miejscu, w którym pracuję (Oracle Application Server 10g, o ile pamiętam), pulowanie jest obsługiwane przez serwer aplikacji. Pobieramy plik
javax.sql.DataSource
przy użyciu wyszukiwania JNDI z rozszerzeniemjavax.sql.InitialContext
.zrobiono coś takiego
(Nie napisaliśmy tego kodu, jest on skopiowany z tej dokumentacji ).
źródło
Basen
performance
[przez ponowne użycie tych samych obiektów do wykonywania jakichkolwiek działań na danych obiektowych] &memory
[przydzielanie i cofanie alokacji wielu obiektów powoduje znaczne obciążenie zarządzania pamięcią].«
Object
Pula [ pula, pulaString
stała , pula,Thread
pula połączeń]Pula stała ciągów
Przykład: ciąg znaków do weryfikacji unikatowego obiektu z puli.
Puli połączeń przy użyciu typu 4 sterownik przy użyciu bibliotek 3rd Party [
DBCP2
,c3p0
,Tomcat JDBC
]Type 4 - The Thin driver converts JDBC calls directly into the vendor-specific database protocol Ex[Oracle - Thick, MySQL - Quora].
wikiW mechanizmie puli połączeń, po załadowaniu klasy pobiera ona
physical JDBC connection
obiekty i udostępnia użytkownikowi opakowany obiekt fizycznego połączenia.PoolableConnection
jest opakowaniem wokół rzeczywistego połączenia.getConnection()
wybierz jedno z wolnych połączeń opakowanych z puli obiektów połączeń i zwróć je.close()
zamiast zamykania zwraca opakowane połączenie z powrotem do puli.Przykład: użycie puli połączeń ~ DBCP2 w środowisku Java 7 [
try-with-resources
]jdbc:<DB>:<drivertype>:<HOST>:<TCP/IP PORT>:<dataBaseName>
jdbc:
oracle
:thin:@localhost:1521:myDBName
jdbc:
mysql
://localhost:3306/myDBName
connectionpool.properties
Aplikacja sieciowa : Aby uniknąć problemów z połączeniem, gdy wszystkie połączenia są zamknięte [domyślny limit czasu oczekiwania MySQL 8 godzin] w celu ponownego otwarcia połączenia z bazową bazą danych.
Możesz to zrobić, aby przetestować każde połączenie, ustawiając testOnBorrow = true i validationQuery = "SELECT 1" i nie używaj funkcji autoReconnect dla serwera MySQL, ponieważ jest on przestarzały. kwestia
Zobacz też:
źródło
public class StringPoolTest
prostu ma dwie metody void, więc nic nie zwracają. Czy ten kod faktycznie przechodzi przez proces zarządzania pulą ciągów? Wydaje się nawet, że nie używa żadnych argumentów.s1
nie zdefiniowano?ConnectionPool
klasie. Dzięki wielkie.Pod koniec 2017 roku Proxool, BoneCP, C3P0, DBCP w większości nie funkcjonują w tym czasie. HikariCP (utworzony w 2012 roku) wydaje się obiecujący, wyrywa drzwi z wszystkiego, co wiem. http://www.baeldung.com/hikaricp
Proxool ma wiele problemów:
- Przy dużym obciążeniu może przekroczyć maksymalną liczbę połączeń i nie powrócić poniżej maksymalnej
- Może nie powrócić do minimalnych połączeń nawet po wygaśnięciu połączeń
- Może zablokować całą pulę (i wszystkie wątki serwera / klienta) jeśli ma problemy z połączeniem się z bazą danych podczas wątku HouseKeeper (nie używa .setQueryTimeout)
- wątek HouseKeeper, mając blokadę puli połączeń dla swojego procesu, żąda od wątku Prototyper ponownego utworzenia połączeń (wymiatania), co może spowodować stan wyścigu / zawieszenie. W wywołaniach tych metod ostatni parametr powinien być zawsze sweep: false podczas pętli, tylko sweep: true pod nim.
- HouseKeeper potrzebuje tylko jednego przemiatania PrototypeController na końcu i ma więcej [wspomniano powyżej]
- Wątek HouseKeeper sprawdza połączenia pod kątem testowania połączeń przed sprawdzeniem, które połączenia mogą wygasnąć [pewne ryzyko testowania wygasłego połączenia, które może zostać zerwane / zakończone przez inne limity czasu do bazy danych w zaporze itp.]
- Projekt ma niedokończony kod (właściwości, które są zdefiniowane ale nie podjęto żadnych działań)
- Domyślny maksymalny czas trwania połączenia, jeśli nie został zdefiniowany, wynosi 4 godziny (nadmierny)
- Wątek HouseKeeper jest uruchamiany co pięć sekund na pulę (nadmierny)
Możesz zmodyfikować kod i wprowadzić te ulepszenia. Ale ponieważ został utworzony w 2003 r. I zaktualizowany w 2008 r., Brakuje w nim prawie 10 lat ulepszeń Java, które wykorzystują rozwiązania takie jak hikaricp.
źródło
Jak odpowiedzieli inni, prawdopodobnie będziesz zadowolony z Apache Dbcp lub c3p0 . Obie są popularne i działają dobrze.
Jeśli chodzi o twoje wątpliwości
Nie zapewniają implementacji, a raczej interfejsy i niektóre klasy pomocnicze, co jest widoczne tylko dla programistów, którzy implementują biblioteki innych firm (pule lub sterowniki). Zwykle nawet na to nie patrzysz. Twój kod powinien obsługiwać połączenia z Twojej puli tak, jakby były „zwykłymi” połączeniami, w przejrzysty sposób.
źródło
Vibur DBCP to kolejna biblioteka do tego celu. Kilka przykładów pokazujących, jak skonfigurować go do użytku z Hibernate, Spring + Hibernate lub programowo, można znaleźć na jego stronie internetowej: http://www.vibur.org/
Zobacz także zrzeczenie się tutaj .
źródło
Apache Commons posiada bibliotekę do tego celu: DBCP . Jeśli nie masz dziwnych wymagań dotyczących swoich basenów, użyłbym biblioteki, ponieważ z pewnością będzie trudniejsza i bardziej subtelna, niż byś się spodziewał.
źródło
Powinieneś rozważyć użycie UCP. Universal Connection Pool (UCP) to pula połączeń Java. Jest to bogata w funkcje pula połączeń i ściśle zintegrowana z bazami danych Oracle Real Application Clusters (RAC), ADG i DG.
Więcej informacji na temat UCP można znaleźć na tej stronie .
źródło
MiniConnectionPoolManager
jest implementacją w jednym pliku java, jeśli szukasz rozwiązania do osadzania i nie przejmujesz się zbytnio wydajnością (chociaż nie testowałem tego pod tym względem).Jest objęty wieloma licencjami EPL , LGPL i MPL .
Jego dokumentacja podaje również alternatywy warte sprawdzenia (oprócz DBCP i C3P0):
źródło