Apa sebenarnya penggunaan Class.forName ("oracle.jdbc.driver.OracleDriver") saat menyambungkan ke database?

93

Apa perintahnya

Class.forName("oracle.jdbc.driver.OracleDriver")

tepatnya dilakukan saat menghubungkan ke database Oracle? Apakah ada cara alternatif untuk melakukan hal yang sama?

Aravind
sumber
6
Terkait: stackoverflow.com/questions/5992126/loading-jdbc-driver Perhatikan bahwa Anda hanya perlu memanggilnya sekali , selama startup aplikasi Anda; Anda tidak perlu meneleponnya setiap saat sebelum mendapatkan koneksi selama masa pakai aplikasi.
BalusC
@BalusC Misalkan saya memiliki detail koneksi saya di kelas terpisah Atempat saya memanggil konstruktor Class.forName("oracle.jdbc.driver.OracleDriver")kelas A, dan saya membuat A'sobjek untuk mendapatkan bidang koneksi untuk setiap servlet di mana saya memerlukan koneksi maka java akan melewati Class.forName("oracle.jdbc.driver.OracleDriver")atau akan memuat lagi?
Asif Mushtaq

Jawaban:

71

Ini memperoleh referensi ke objek kelas dengan FQCN (nama kelas yang memenuhi syarat) oracle.jdbc.driver.OracleDriver.

Itu tidak "melakukan" apa pun dalam hal menghubungkan ke database, selain dari memastikan bahwa kelas yang ditentukan dimuat oleh classloader saat ini . Tidak ada perbedaan mendasar antara menulis

Class<?> driverClass = Class.forName("oracle.jdbc.driver.OracleDriver");
// and
Class<?> stringClass = Class.forName("java.lang.String");

Class.forName("com.example.some.jdbc.driver")panggilan muncul di kode lama yang menggunakan JDBC karena itu adalah cara lama untuk memuat driver JDBC .

Dari Tutorial Java :

Di versi JDBC sebelumnya, untuk mendapatkan koneksi, Anda harus menginisialisasi driver JDBC Anda terlebih dahulu dengan memanggil metode tersebut Class.forName. Metode ini membutuhkan objek bertipe java.sql.Driver. Setiap driver JDBC berisi satu atau lebih kelas yang mengimplementasikan antarmuka java.sql.Driver.
...
Semua driver JDBC 4.0 yang ditemukan di jalur kelas Anda dimuat secara otomatis. (Namun, Anda harus memuat driver apa pun secara manual sebelum JDBC 4.0 dengan metode ini Class.forName.)

Bacaan lebih lanjut (baca: pertanyaan ini duplikatnya)

Matt Ball
sumber
29
Dengan kata lain, ini memungkinkan Anda untuk menggunakan kelas Driver tanpa harus mengimpor secara eksplisit untuk kelas Anda. Ini memungkinkan Anda untuk membangun proyek tanpa harus memiliki driver Oracle di classpath Anda.
JustinKSU
3
harus diperhatikan bahwa dalam "cara lama" Anda akan memanggil Class.forName()tanpa menangkap referensi ke driverClass yang dikembalikan, jadi tampaknya sekilas seperti operasi tanpa operasi
matt b
11
Itu karena driver JDBC harus memiliki penginisialisasi statis yang mendaftarkan driver dengan DriverManager. Saat menggunakan Class.forName () penginisialisasi ini dijalankan dan driver terdaftar. Sejak JDBC 4.0 DriverManager sendiri menggunakan ServiceLoader untuk menemukan driver di classpath.
Mark Rotteveel
1
@MattBall, Mengenai pra-JDBC 4.0, mendapatkan referensi ke driver atau memanggil fungsi statis dari kelas driver tersebut sudah akan memuat kelas driver tersebut secara otomatis. Lalu kenapa harus kita lakukan secara manual Class.forName("etc.driver")?
Pacerier
1
@Penerima asumsi salah. JDBC tidak tahu driver mana yang ingin Anda muat, jadi tidak ada di JDBC (yang merupakan driver-agnostik) yang mengetahui untuk merujuk ke kelas driver. Jadi, Anda membutuhkan sesuatu yang memicu beban kelas. Saya kira metode statis akan berfungsi sebagai pengganti Class.forName(...).
Matt Ball
13

Ini mendaftarkan pengemudi; sesuatu dari bentuk:

public class SomeDriver implements Driver {
  static {
    try {
      DriverManager.registerDriver(new SomeDriver());
    } catch (SQLException e) {
      // TODO Auto-generated catch block
    }
  }

  //etc: implemented methods
}
McDowell
sumber
6

Dari tutorial Java JDBC :

Di versi JDBC sebelumnya, untuk mendapatkan koneksi, Anda harus menginisialisasi driver JDBC Anda terlebih dahulu dengan memanggil metode tersebut Class.forName. Semua driver JDBC 4.0 yang ditemukan di jalur kelas Anda akan dimuat secara otomatis. (Namun, Anda harus memuat driver apa pun secara manual sebelum JDBC 4.0 dengan metode ini Class.forName.)

Jadi, jika Anda menggunakan driver Oracle 11g (11.1) dengan Java 1.6, Anda tidak perlu menelepon Class.forName. Jika tidak, Anda perlu memanggilnya untuk menginisialisasi driver.

Jonathan
sumber
1
@Jonathanwhat yang Anda maksud dengan "memuat driver secara manual sebelum JDBC 4.0 dengan metode Class.forName" dapatkah Anda jelaskan?
Aravind
The Class.forNamepasukan panggilan classloader untuk memuat kelas tertentu. Ini adalah langkah pemuatan manual yang dijelaskan dalam tutorial.
Jonathan
@Jonathan Jadi itulah mengapa koneksi saya masih berfungsi tanpa class.forName();:)
Asif Mushtaq
2

Sebelum Java 6 DriverManagerkelas tidak akan tahu driver JDBC mana yang ingin Anda gunakan. Class.forName("...")adalah cara untuk melakukan pramuat kelas pengemudi.

Jika Anda menggunakan Java 6, Anda tidak perlu lagi melakukan ini.

Qwerky
sumber
Ya, seseorang perlu menggunakan: OracleDataSource sekarang docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726 dan membuat url sendiri: final OracleDataSource ds = new OracleDataSource (); ds.setDriverType ("tipis"); ds.setServerName (hostName); ds.setPortNumber (port); //ds.setDatabaseName(dbName); ds.setServiceName (dbName); koneksi = ds.getConnection (pengguna, pwd);
Rajesh Goel
1

Perintah ini memuat kelas driver jdbc Oracle agar tersedia untuk instance DriverManager. Setelah kelas dimuat sistem dapat terhubung ke Oracle menggunakannya. Sebagai alternatif, Anda dapat menggunakan metode registerDriver dari DriverManager dan meneruskannya dengan instance driver JDBC yang Anda butuhkan.

anatolich
sumber
0

Gunakan oracle.jdbc.OracleDriver, bukan oracle.jdbc.driver.OracleDriver. Anda tidak perlu mendaftarkannya jika file jar driver ada di direktori "WEB-INF \ lib", jika Anda menggunakan Tomcat. Simpan ini sebagai test.jsp dan letakkan di direktori web Anda, dan terapkan ulang folder aplikasi web Anda di manajer 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
        }
    }
}

%>
Tom
sumber