2011-08-08 28 views
36

Tôi gặp vấn đề lạ khi hai ứng dụng web với trình điều khiển Oracle JDBC sẽ xung đột với nhau. Tôi phải đặt JAR trình điều khiển JDBC vào thư mục chung TOMCAT_HOME/lib. Lý do cho điều này là gì?Tại sao trình điều khiển JDBC được đặt trong thư mục TOMCAT_HOME/lib?

+2

Ý bạn là gì sẽ xung đột với nhau? Chính xác cuộc xung đột là gì? Và bạn đang sử dụng JNDI hoặc truy cập JDBC trực tiếp? – ziggy

Trả lời

71

Trình điều khiển JDBC đăng ký chính mình trong toàn bộ đơn JVM DriverManager được chia sẻ bởi tất cả ứng dụng web. Nếu bạn có cùng tên (giống như tên lớp), trình điều khiển JDBC đăng ký hai lần từ hai ứng dụng web khác nhau, điều này có thể gây ra vấn đề của bạn. Điều này thậm chí còn có vấn đề hơn nếu các ứng dụng web của bạn sử dụng các phiên bản khác nhau của cùng một trình điều khiển JDBC.

Ngoài ra, việc đưa trình điều khiển JDBC vào thư mục lib của Tomcat sẽ giúp ngăn chặn rò rỉ bộ nhớ khi bạn triển khai lại ứng dụng web mà không cần khởi động lại Tomcat, ví dụ: nếu bạn chỉ cần đặt một tệp WAR mới vào thư mục webapps của Tomcat:

Lớp DriverManager được tải bởi trình nạp lớp bootstrap và do đó "sống" trên toàn cầu trong JVM, trong khi Tomcat tải tất cả ứng dụng web trong trình nạp lớp của riêng chúng. Vì vậy, nếu một trình điều khiển JDBC từ thư mục WEB-INF/lib của ứng dụng web đăng ký chính nó trong DriverManager, nó ghim trình nạp lớp của ứng dụng web vào bộ nhớ (và do đó tất cả các lớp của ứng dụng web đó), ngăn chặn việc thu gom rác của nó.

Nếu thay vào đó cả hai DriverManager và trình điều khiển JDBC đến từ trình nạp lớp ứng dụng không phải web, bạn có thể tự do triển khai lại ứng dụng web của mình mà không cần bất kỳ lớp ứng dụng web nào tự khóa trong các lớp được tải từ các trình nạp lớp khác.

Phiên bản hiện tại của Tomcat (có thể là 6.x và chắc chắn 7.x) sẽ ghi nhật ký về việc không triển khai ứng dụng web nếu phát hiện thấy rò rỉ bộ nhớ, trong số những thứ khác bằng trình điều khiển JDBC.

+0

đặt sql jar bên trong thư mục lib của tomcat "apache-tomcat-7.0.37 \ lib" sẽ giải quyết vấn đề? – greenhorn

+1

Có, nếu bạn đặt một JAR trình điều khiển JDBC duy nhất vào lib của Tomcat/(thay vì lib của ứng dụng web của bạn /), điều này sẽ tránh các xung đột như được mô tả bởi áp phích gốc. Tất nhiên, tất cả các ứng dụng của bạn phải có khả năng làm việc với cùng phiên bản trình điều khiển JDBC. –

+19

Chỉ là tôi, hay một "DriverManager đơn lẻ toàn bộ JVM" có vẻ giống như một lỗi chính trong thiết kế JDBC? –

Các vấn đề liên quan