Lệnh gì sẽ
Class.forName("oracle.jdbc.driver.OracleDriver")
chính xác khi kết nối với cơ sở dữ liệu Oracle? Có cách nào khác để làm điều tương tự không?
Lệnh gì sẽ
Class.forName("oracle.jdbc.driver.OracleDriver")
chính xác khi kết nối với cơ sở dữ liệu Oracle? Có cách nào khác để làm điều tương tự không?
A
nơi tôi gọi Class.forName("oracle.jdbc.driver.OracleDriver")
trong phương thức A
khởi tạo lớp và tôi tạo A's
đối tượng để lấy trường kết nối cho mỗi servlet nơi tôi cần kết nối thì java sẽ bỏ qua Class.forName("oracle.jdbc.driver.OracleDriver")
hay sẽ tải lại?
Câu trả lời:
Nó nhận được một tham chiếu đến đối tượng lớp với FQCN (tên lớp đủ điều kiện) oracle.jdbc.driver.OracleDriver
.
Nó không "làm" bất cứ điều gì về mặt kết nối với cơ sở dữ liệu, ngoài việc đảm bảo rằng lớp được chỉ định được tải bởi trình nạp lớp hiện tại . Không có sự khác biệt cơ bản giữa cách viết
Class<?> driverClass = Class.forName("oracle.jdbc.driver.OracleDriver");
// and
Class<?> stringClass = Class.forName("java.lang.String");
Class.forName("com.example.some.jdbc.driver")
cuộc gọi hiển thị trong mã kế thừa sử dụng JDBC vì đó là cách cũ để tải trình điều khiển JDBC .
Từ Hướng dẫn Java :
Trong các phiên bản trước của JDBC, để có được kết nối, trước tiên bạn phải khởi tạo trình điều khiển JDBC của mình bằng cách gọi phương thức
Class.forName
. Các phương thức này yêu cầu một đối tượng kiểujava.sql.Driver
. Mỗi trình điều khiển JDBC chứa một hoặc nhiều lớp thực hiện giao diệnjava.sql.Driver
.
...
Mọi trình điều khiển JDBC 4.0 được tìm thấy trong đường dẫn lớp của bạn đều được tải tự động. (Tuy nhiên, bạn phải tải thủ công bất kỳ trình điều khiển nào trước JDBC 4.0 bằng phương pháp nàyClass.forName
.)
Class.forName()
mà không chiếm được tham chiếu đến driverClass trở, vì vậy nó có vẻ ở cái nhìn đầu tiên như một hoạt động không-op
Class.forName("etc.driver")
?
Class.forName(...)
.
Từ hướng dẫn Java JDBC :
Trong các phiên bản trước của JDBC, để có được kết nối, trước tiên bạn phải khởi tạo trình điều khiển JDBC của mình bằng cách gọi phương thức
Class.forName
. Bất kỳ trình điều khiển JDBC 4.0 nào được tìm thấy trong đường dẫn lớp của bạn đều được tải tự động. (Tuy nhiên, bạn phải tải thủ công bất kỳ trình điều khiển nào trước JDBC 4.0 bằng phương pháp nàyClass.forName
.)
Vì vậy, nếu bạn đang sử dụng trình điều khiển Oracle 11g (11.1) với Java 1.6, bạn không cần gọi Class.forName
. Nếu không, bạn cần gọi nó để khởi tạo trình điều khiển.
Class.forName
gọi buộc trình nạp lớp tải lớp đã cho. Đây là bước tải thủ công được mô tả trong hướng dẫn.
class.forName();
:)
Trước Java 6, DriverManager
lớp sẽ không biết trình điều khiển JDBC nào bạn muốn sử dụng. Class.forName("...")
là một cách để tải trước các lớp trình điều khiển.
Nếu bạn đang sử dụng Java 6, bạn không cần phải làm điều này nữa.
Lệnh này tải lớp trình điều khiển jdbc của Oracle để có sẵn cho phiên bản DriverManager. Sau khi lớp được tải hệ thống có thể kết nối với Oracle bằng cách sử dụng nó. Thay vào đó, bạn có thể sử dụng phương thức registerDriver của DriverManager và chuyển nó với phiên bản trình điều khiển JDBC mà bạn cần.
Một giải pháp thay thế sẽ sử dụng thuộc tính Hệ thống jdbc.drivers để chỉ định (các) trình điều khiển cần thiết của bạn trên dòng lệnh khi bạn khởi động JVM.
Sử dụng oracle.jdbc.OracleDriver, không phải oracle.jdbc.driver.OracleDriver. Bạn không cần phải đăng ký nó nếu tệp jar trình điều khiển nằm trong thư mục "WEB-INF \ lib", nếu bạn đang sử dụng Tomcat. Lưu tệp này dưới dạng test.jsp và đặt nó vào thư mục web của bạn và triển khai lại thư mục ứng dụng web của bạn trong trình quản lý Tomcat:
<%@ page import="java.sql.*" %>
<HTML>
<HEAD>
<TITLE>Simple JSP Oracle Test</TITLE>
</HEAD><BODY>
<%
Connection conn = null;
try {
Class.forName("oracle.jdbc.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XXX.XXX:XXXX:dbName", "user", "password");
Statement stmt = conn.createStatement();
out.println("Connection established!");
}
catch (Exception ex)
{
out.println("Exception: " + ex.getMessage() + "");
}
finally
{
if (conn != null) {
try {
conn.close();
}
catch (Exception ignored) {
// ignore
}
}
}
%>