Bir veritabanına bağlanırken Class.forName ("oracle.jdbc.driver.OracleDriver") gerçek kullanımı nedir?


93

Komut ne olacak

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

bir Oracle veritabanına bağlanırken tam olarak ne yapmalı? Aynı şeyi yapmanın başka bir yolu var mı?


6
İlgili: stackoverflow.com/questions/5992126/loading-jdbc-driver Uygulamanızın başlatılması sırasında yalnızca bir kez aramanız gerektiğini unutmayın ; uygulamanın ömrü boyunca bağlantı kurmadan önce her seferinde aramanıza gerek yoktur.
BalusC

@BalusC Farz edelim ki bağlantı detayım sınıf kurucusunu Açağırdığım ayrı bir sınıfta ve bağlantıya ihtiyacım olan her sunucu için bağlantı alanı elde etmek için nesne oluşturuyorum, o zaman java atlayacak veya tekrar yüklenecek? Class.forName("oracle.jdbc.driver.OracleDriver")AA'sClass.forName("oracle.jdbc.driver.OracleDriver")
Asif Mushtaq

Yanıtlar:


72

FQCN (tam nitelenmiş sınıf adı) ile sınıf nesnesine bir başvuru alır oracle.jdbc.driver.OracleDriver.

Belirtilen sınıfın geçerli sınıf yükleyici tarafından yüklenmesini sağlamanın yanı sıra, bir veritabanına bağlanma açısından hiçbir şey "yapmaz" . Yazmak arasında temel bir fark yok

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

Class.forName("com.example.some.jdbc.driver")Çağrılar , JDBC sürücüsünü yüklemenin eski yolu olduğu için JDBC kullanan eski kodda görünür .

Gönderen Java Eğitimi :

JDBC'nin önceki sürümlerinde, bir bağlantı elde etmek için, önce yöntemi çağırarak JDBC sürücünüzü başlatmanız gerekiyordu Class.forName. Bu yöntemler, türde bir nesne gerektiriyordu java.sql.Driver. Her JDBC sürücüsü, arayüzü uygulayan bir veya daha fazla sınıf içerir java.sql.Driver.
...
Sınıf yolunuzda bulunan tüm JDBC 4.0 sürücüleri otomatik olarak yüklenir. (Ancak, yöntemle JDBC 4.0 öncesi tüm sürücüleri manuel olarak yüklemeniz gerekir Class.forName.)

Daha fazla okuma (okuyun: sorular bu bir kopyasıdır)


29
Başka bir deyişle, sınıfınız için açık bir içe aktarma işlemi olmadan Driver sınıfını kullanmanıza izin verir. Bu, sınıf yolunuzda Oracle sürücüsüne sahip olmak zorunda kalmadan projeyi oluşturmanıza olanak tanır.
JustinKSU

3
"eski yöntemde" Class.forName(), döndürülen driverClass referansını yakalamadan arayacağınıza dikkat etmelisiniz, bu nedenle ilk bakışta işlemsiz bir işlem gibi görünecektir
matt b

11
Bunun nedeni, bir JDBC sürücüsünün, sürücüyü DriverManager'a kaydeden statik bir başlatıcıya sahip olması gerektiğidir. Class.forName () kullanılırken bu başlatıcı çalıştırılır ve sürücü kaydedilir. JDBC 4.0'dan beri DriverManager, sınıf yolunda sürücüleri bulmak için ServiceLoader'ı kullanır.
Mark Rotteveel

1
@MattBall, JDBC 4.0 öncesi ile ilgili olarak, sürücüye bir başvuru almak veya bu sürücü sınıfının statik bir işlevini çağırmak, sürücü sınıfını zaten otomatik olarak yükleyecektir. Öyleyse neden manuel olarak yapmak zorundayız Class.forName("etc.driver")?
Pacerier

1
@Pacerier yanlış varsayımı. JDBC hangi sürücüyü yüklemek istediğinizi bilmez, bu nedenle JDBC'de (sürücüden bağımsızdır) sürücü sınıfına başvurmayı bilen hiçbir şey yoktur. Yani sınıf yükünü tetikleyen bir şeye ihtiyacınız var . Bunun yerine statik bir yöntemin çalışacağını düşünüyorum Class.forName(...).
Matt Topu

13

Sürücüyü kaydeder; formda bir şey:

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

  //etc: implemented methods
}

7

Gönderen Java JDBC öğretici :

JDBC'nin önceki sürümlerinde, bir bağlantı elde etmek için, önce yöntemi çağırarak JDBC sürücünüzü başlatmanız gerekiyordu Class.forName. Sınıf yolunuzda bulunan tüm JDBC 4.0 sürücüleri otomatik olarak yüklenir. (Ancak, yöntemle JDBC 4.0 öncesi tüm sürücüleri manuel olarak yüklemeniz gerekir Class.forName.)

Dolayısıyla, Java 1.6 ile Oracle 11g (11.1) sürücüsünü kullanıyorsanız, aramanıza gerek yoktur Class.forName. Aksi takdirde, sürücüyü başlatmak için aramanız gerekir.


1
@Jonathan "JDBC 4.0 öncesi herhangi bir sürücüyü Class.forName yöntemiyle manuel olarak yükle" ile ne demek istiyorsunuz?
Aravind

Class.forNameÇağrı kuvvetleri classloader verilen sınıf yüklemek için. Bu, eğitimde açıklanan manuel yükleme adımıdır.
Jonathan

@Jonathan Demek bu yüzden bağlantım hala olmadan çalışıyor class.forName();:)
Asif Mushtaq

2

Java 6 öncesi DriverManagersınıf, hangi JDBC sürücüsünü kullanmak istediğinizi bilemezdi. Class.forName("...")sürücü sınıflarını önceden yüklemenin bir yoluydu.

Java 6 kullanıyorsanız artık bunu yapmanız gerekmez.


Evet, birinin kullanılması gerekiyor: OracleDataSource şimdi OracleDataSource docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726 ve url'yi kendi başına yapıyor: final OracleDataSource ds = new OracleDataSource (); ds.setDriverType ("ince"); ds.setServerName (hostName); ds.setPortNumber (bağlantı noktası); //ds.setDatabaseName(dbName); ds.setServiceName (dbName); bağlantı = ds.getConnection (kullanıcı, pwd);
Rajesh Goel

1

Bu komut, DriverManager örneği için kullanılabilir olması için Oracle jdbc sürücüsünün sınıfını yükler. Sınıf yüklendikten sonra sistem onu ​​kullanarak Oracle'a bağlanabilir. Alternatif olarak, DriverManager'ın registerDriver yöntemini kullanabilir ve bunu ihtiyacınız olan JDBC sürücüsü örneğiyle geçirebilirsiniz.



0

Oracle.jdbc.OracleDriver'ı kullanın, oracle.jdbc.driver.OracleDriver'ı değil. Tomcat kullanıyorsanız, sürücü jar dosyası "WEB-INF \ lib" dizinindeyse, kaydetmenize gerek yoktur. Bunu test.jsp olarak kaydedin ve web dizininize koyun ve Tomcat yöneticisinde web uygulaması klasörünüzü yeniden konuşlandırın:

<%@ 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
        }
    }
}

%>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.