2011-08-08 10 views
36

Mam dziwny problem, gdy dwie aplikacje internetowe ze sterownikiem JDBC Oracle będą ze sobą kolidować. Muszę umieścić plik JAR sterownika JDBC we wspólnym folderze TOMCAT_HOME/lib. Jaki jest tego powód?Dlaczego sterownik JDBC należy umieścić w folderze TOMCAT_HOME/lib?

+2

Co masz na myśli, że będzie ze sobą w konflikcie? Czym dokładnie jest konflikt? Czy używasz JNDI lub bezpośredniego dostępu JDBC? – ziggy

Odpowiedz

71

Sterowniki JDBC rejestrują się w całym JVM singleton DriverManager, który jest udostępniany przez aplikacje internetowe wszystkie. Jeśli masz takie same (jak w nazwie klasy) sterownik JDBC rejestruje się dwa razy z dwóch różnych aplikacji internetowych, może to spowodować problem. Jest to jeszcze bardziej problematyczne, jeśli twoje aplikacje internetowe używają różnych wersji tego samego sterownika JDBC.

Ponadto umieszczenie sterowników JDBC w folderze lib Tomcat pomoże zapobiec wyciekom pamięci po ponownym wdrożeniu aplikacji internetowej bez restartowania Tomcat, np. jeśli właśnie umieścisz nowy plik WAR w folderze webmasterów Tomcat:

Klasa DriverManager zostaje załadowana przez moduł ładujący ładowania początkowego i tym samym "żyje" globalnie w JVM, podczas gdy Tomcat ładuje wszystkie aplikacje internetowe w swoich modułach ładowania klas. Jeśli więc sterownik JDBC z folderu WEB-INF/lib aplikacji internetowej zarejestruje się w numerze DriverManager, przypina ten moduł ładujący klasy aplikacji do pamięci (a tym samym do wszystkich klas tej aplikacji internetowej), uniemożliwiając jego odśmiecanie.

Jeśli zamiast tego zarówno sterowniki DriverManager, jak i JDBC pochodzą z aplikacji innych niż aplikacje internetowe, można swobodnie przenosić aplikacje internetowe bez przypisywania sobie klas aplikacji WWW do klas ładowanych z innych programów ładujących klasy.

Aktualne wersje Tomcata (prawdopodobnie 6.x i zdecydowanie 7.x) będą rejestrować ostrzeżenia o nieumiejętności aplikacji internetowej, jeśli wykryty zostanie wyciek pamięci, między innymi przez sterowniki JDBC.

+0

umieszczenie sql jar wewnątrz folderu lib tomcat "apache-tomcat-7.0.37 \ lib" rozwiąże problem? – greenhorn

+1

Tak, jeśli umieścisz pojedynczy plik JAR sterownika JDBC w bibliotece lib/(zamiast biblioteki lib /) serwera Tomcat, uniknie to konfliktów opisanych w oryginalnym plakacie. Oczywiście wszystkie aplikacje muszą mieć możliwość pracy z tą samą wersją sterownika JDBC. –

+19

Czy to tylko ja, czy też "Jogner DriverManager" w języku JVM wydaje się poważnym błędem w projektowaniu JDBC? –

Powiązane problemy