จะสั่งอะไร
Class.forName("oracle.jdbc.driver.OracleDriver")
ขณะเชื่อมต่อกับฐานข้อมูล Oracle หรือไม่ มีวิธีอื่นในการทำสิ่งเดียวกันหรือไม่?
จะสั่งอะไร
Class.forName("oracle.jdbc.driver.OracleDriver")
ขณะเชื่อมต่อกับฐานข้อมูล Oracle หรือไม่ มีวิธีอื่นในการทำสิ่งเดียวกันหรือไม่?
A
ที่ฉันเรียกClass.forName("oracle.jdbc.driver.OracleDriver")
ในตัวA
สร้างคลาสและฉันสร้างA's
อ็อบเจกต์เพื่อรับฟิลด์การเชื่อมต่อสำหรับแต่ละ servlet ที่ฉันต้องการการเชื่อมต่อจากนั้น java จะข้ามClass.forName("oracle.jdbc.driver.OracleDriver")
หรือจะโหลดอีกครั้ง?
คำตอบ:
มันได้รับการอ้างอิงไปยังวัตถุชั้นกับ FQCN oracle.jdbc.driver.OracleDriver
(ชื่อชั้นที่มีคุณสมบัติครบถ้วน)
มันไม่ได้ "ทำ" อะไรในแง่ของการเชื่อมต่อกับฐานข้อมูลนอกเหนือจากการตรวจสอบให้แน่ใจว่าชั้นที่ระบุมีการโหลดโดย ClassLoader ไม่มีความแตกต่างพื้นฐานระหว่างการเขียน
Class<?> driverClass = Class.forName("oracle.jdbc.driver.OracleDriver");
// and
Class<?> stringClass = Class.forName("java.lang.String");
Class.forName("com.example.some.jdbc.driver")
โทรแสดงขึ้นในมรดกรหัสที่ใช้ JDBC เนื่องจากว่าเป็นมรดกทางของการโหลดไดรเวอร์ JDBC
จากบทช่วยสอน Java :
ในรุ่นก่อนหน้าของ JDBC ที่จะได้รับการเชื่อมต่อครั้งแรกที่คุณจะต้องเริ่มต้นไดรเวอร์ JDBC
Class.forName
ของคุณโดยการเรียกวิธีการjava.sql.Driver
วิธีการนี้ต้องวัตถุของการพิมพ์ แต่ละไดรเวอร์ JDBCjava.sql.Driver
มีมากกว่าหนึ่งชั้นเรียนที่ดำเนินการอินเตอร์เฟซ
...
ไดรเวอร์ JDBC 4.0 ใด ๆ ที่พบในพา ธ คลาสของคุณจะถูกโหลดโดยอัตโนมัติ (อย่างไรก็ตามคุณต้องโหลดไดรเวอร์ก่อน JDBC 4.0 ด้วยตนเองด้วยวิธีClass.forName
นี้)
Class.forName()
โดยไม่จับการอ้างอิงถึง driverClass ที่ส่งคืนดังนั้นในตอนแรกดูเหมือนว่าจะไม่มีการดำเนินการใด ๆ
Class.forName("etc.driver")
?
Class.forName(...)
ผมคิดว่าวิธีการแบบคงที่จะทำงานแทน
มันลงทะเบียนไดรเวอร์ บางอย่างในรูปแบบ:
public class SomeDriver implements Driver {
static {
try {
DriverManager.registerDriver(new SomeDriver());
} catch (SQLException e) {
// TODO Auto-generated catch block
}
}
//etc: implemented methods
}
จากบทช่วยสอน Java JDBC :
ในรุ่นก่อนหน้าของ JDBC ที่จะได้รับการเชื่อมต่อครั้งแรกที่คุณจะต้องเริ่มต้นไดรเวอร์ JDBC
Class.forName
ของคุณโดยการเรียกวิธีการ ไดรเวอร์ JDBC 4.0 ใด ๆ ที่พบในพา ธ คลาสของคุณจะถูกโหลดโดยอัตโนมัติ (อย่างไรก็ตามคุณต้องโหลดไดรเวอร์ก่อน JDBC 4.0 ด้วยตนเองด้วยวิธีClass.forName
นี้)
ดังนั้นถ้าคุณกำลังใช้ Oracle 11g (11.1) คนขับกับ Java 1.6 Class.forName
คุณไม่จำเป็นต้องโทร มิฉะนั้นคุณจะต้องเรียกมันเพื่อเริ่มต้นไดรเวอร์
Class.forName
เรียกใช้บังคับให้ classloader โหลดคลาสที่กำหนด นี่คือขั้นตอนการโหลดด้วยตนเองที่อธิบายไว้ในบทช่วยสอน
class.forName();
:)
Pre Java 6 DriverManager
คลาสจะไม่ทราบว่าคุณต้องการใช้ไดรเวอร์ JDBC ตัวใด Class.forName("...")
เป็นวิธีการโหลดคลาสไดรเวอร์ล่วงหน้า
หากคุณใช้ Java 6 คุณไม่จำเป็นต้องทำสิ่งนี้อีกต่อไป
คำสั่งนี้โหลดคลาสของไดรเวอร์ Oracle jdbc เพื่อให้พร้อมใช้งานสำหรับอินสแตนซ์ DriverManager หลังจากโหลดคลาสแล้วระบบสามารถเชื่อมต่อกับ Oracle โดยใช้มัน คุณสามารถใช้วิธี registerDriver ของ DriverManager และส่งผ่านอินสแตนซ์ของไดรเวอร์ JDBC ที่คุณต้องการได้
อีกทางเลือกหนึ่งคือใช้คุณสมบัติ jdbc.drivers Systemเพื่อระบุไดรเวอร์ที่ต้องการของคุณบนบรรทัดรับคำสั่งเมื่อคุณเริ่ม JVM
ใช้ oracle.jdbc.OracleDriver ไม่ใช่ oracle.jdbc.driver.OracleDriver คุณไม่จำเป็นต้องลงทะเบียนหากไฟล์ jar ของไดรเวอร์อยู่ในไดเร็กทอรี "WEB-INF \ lib" หากคุณใช้ Tomcat บันทึกสิ่งนี้เป็น test.jsp และวางไว้ในไดเรกทอรีเว็บของคุณและปรับใช้โฟลเดอร์เว็บแอปของคุณอีกครั้งในตัวจัดการ 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
}
}
}
%>