2011-01-09 42 views
10

Đã tự hỏi tại sao cả hai Class.forName("com.mysql.jdbc.Driver");Class.forName("com.mysql.jdbc.Driver").newInstance(); hoạt động khi tôi sử dụng chúng để kết nối với cơ sở dữ liệu. Bởi đúng, không phải là trước đây không phải làm việc, vì không có trường hợp mới được tạo ra. Tuy nhiên, nó vẫn hoạt động. Im sử dụng netbeans 6.9.1. Cảm ơn vì đầu vào của bạn!Kết nối JDBC- Class.forName vs Class.forName(). NewInstance?

Trả lời

10

Class.forName("xxx") không tạo kết nối tới cơ sở dữ liệu, nó chỉ tải trình điều khiển JDBC và đăng ký nó để cuộc gọi DriverManager.getConnection(...) tiếp theo sẽ hoạt động. Việc tự khởi động trình điều khiển là không cần thiết.

+0

cảm ơn! một qn- nếu u khởi tạo nó, thì DriverManager.getConnection tiếp theo (..) sẽ không khởi tạo lại nó, đúng không? Nó sẽ làm như vậy chỉ khi bạn không khởi tạo nó trong bước đầu tiên? – OckhamsRazor

+0

Tôi nghi ngờ rằng chỉ bằng cách tải lớp, trình quản lý trình điều khiển đã khởi tạo nó, được kích hoạt bởi một khối tĩnh trong trình điều khiển. Thành thật mà nói, tôi không hoàn toàn chắc chắn. Nếu bạn muốn sử dụng trình điều khiển bạn đã khởi tạo (ví dụ như quấn quanh nó), bạn cần tránh sử dụng DriverManager để nhận kết nối hoặc đăng ký cá thể trình điều khiển của riêng bạn bằng các phương pháp tĩnh DriverManager. – araqnid

1

Với trình điều khiển hỗ trợ jdbc 4.0 bạn thậm chí không cần Class.forName(). Trình điều khiển được cho là có trong cơ chế được xây dựng để tải chính nó trên bay, khi DriverManager tìm kiếm nó.

(ref: http://download.oracle.com/javase/6/docs/api/java/sql/DriverManager.html) Các phương pháp DriverManager getConnection và getDrivers đã được cải tiến để hỗ trợ cơ chế Nhà cung cấp dịch vụ Java Standard Edition. Trình điều khiển JDBC 4.0 phải bao gồm tệp META-INF/services/java.sql.Driver. Tệp này chứa tên của việc thực hiện trình điều khiển JDBC của java.sql.Driver. Ví dụ, để tải các lớp my.sql.Driver, thư mục META-INF tập tin/dịch vụ/java.sql.Driver sẽ chứa các mục:

my.sql.Driver

ứng dụng không còn cần phải explictly tải các trình điều khiển JDBC bằng Class.forName(). Các chương trình hiện đang tải trình điều khiển JDBC bằng Class.forName() sẽ tiếp tục hoạt động mà không cần sửa đổi.

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