Jakie jest rzeczywiste użycie Class.forName („oracle.jdbc.driver.OracleDriver”) podczas łączenia się z bazą danych?

93

Jakie polecenie

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

dokładnie zrobić podczas łączenia się z bazą danych Oracle? Czy istnieje inny sposób zrobienia tego samego?

Aravind
źródło
6
Powiązane: stackoverflow.com/questions/5992126/loading-jdbc-driver Zauważ, że musisz wywołać to tylko raz , podczas uruchamiania aplikacji; nie musisz go wywoływać za każdym razem przed uzyskaniem połączenia w okresie istnienia aplikacji.
BalusC
@BalusC Załóżmy, że mam szczegóły połączenia w oddzielnej klasie, w Aktórej wywołuję konstruktor Class.forName("oracle.jdbc.driver.OracleDriver")klasy Ai tworzę A'sobiekt, aby uzyskać pole połączenia dla każdego serwletu, w którym potrzebuję połączenia, a następnie java pominie Class.forName("oracle.jdbc.driver.OracleDriver")lub załaduje się ponownie?
Asif Mushtaq

Odpowiedzi:

71

Uzyskuje odwołanie do obiektu klasy z FQCN (w pełni kwalifikowana nazwa klasy) oracle.jdbc.driver.OracleDriver.

Nie "robi" niczego w zakresie łączenia się z bazą danych, poza upewnieniem się, że określona klasa jest ładowana przez bieżący program ładujący . Nie ma zasadniczej różnicy między pisaniem

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

Class.forName("com.example.some.jdbc.driver")wywołania pojawiają się w starszym kodzie, który używa JDBC, ponieważ jest to starszy sposób ładowania sterownika JDBC .

Z samouczka Java :

W poprzednich wersjach JDBC, aby uzyskać połączenie, trzeba było najpierw zainicjować sterownik JDBC, wywołując metodę Class.forName. Te metody wymagały obiektu typu java.sql.Driver. Każdy sterownik JDBC zawiera co najmniej jedną klasę implementującą interfejs java.sql.Driver.
...
Wszystkie sterowniki JDBC 4.0 znalezione w ścieżce klasy są ładowane automatycznie. (Jednak za pomocą tej metody należy ręcznie załadować wszystkie sterowniki starsze niż JDBC 4.0 Class.forName).

Dalsza lektura (czytaj: pytania to jest dupkiem)

Matt Ball
źródło
29
Innymi słowy, pozwala ci używać klasy Driver bez jawnego importu twojej klasy. Pozwala to na zbudowanie projektu bez konieczności posiadania sterownika Oracle w ścieżce klas.
JustinKSU
3
należy jednak pamiętać, że w „tradycyjny sposób” zadzwoniłbyś Class.forName()bez przechwytywania odniesienia do zwróconej klasy driverClass, więc na pierwszy rzut oka wydaje się, że operacja nie działa
mat b
11
Dzieje się tak, ponieważ sterownik JDBC powinien mieć statyczny inicjator, który rejestruje sterownik za pomocą DriverManager. Podczas korzystania z Class.forName () inicjalizator jest wykonywany, a sterownik jest rejestrowany. Począwszy od JDBC 4.0, sam DriverManager używa ServiceLoadera do znajdowania sterowników w ścieżce klas.
Mark Rotteveel
1
@MattBall, W odniesieniu do wersji wcześniejszych niż JDBC 4.0, uzyskanie odniesienia do sterownika lub wywołanie statycznej funkcji tej klasy sterownika spowodowałoby już automatyczne załadowanie klasy sterownika. Dlaczego więc musimy to zrobić ręcznie Class.forName("etc.driver")?
Pacerier
1
@Pacerier nieprawidłowe założenie. JDBC nie wie, który sterownik chcesz załadować, więc w JDBC (który jest niezależny od sterownika) nie ma nic, co mogłoby odwołać się do klasy sterownika. Potrzebujesz więc czegoś, co wyzwoli ładowanie klasy. Przypuszczam, że zamiast tego zadziałaby metoda statyczna Class.forName(...).
Matt Ball
13

Rejestruje kierowcę; coś w formie:

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

  //etc: implemented methods
}
McDowell
źródło
6

Z samouczka Java JDBC :

W poprzednich wersjach JDBC, aby uzyskać połączenie, trzeba było najpierw zainicjować sterownik JDBC, wywołując metodę Class.forName. Wszystkie sterowniki JDBC 4.0 znalezione w ścieżce klasy są ładowane automatycznie. (Jednak za pomocą tej metody należy ręcznie załadować wszystkie sterowniki starsze niż JDBC 4.0 Class.forName).

Tak więc, jeśli używasz sterownika Oracle 11g (11.1) z Javą 1.6, nie musisz dzwonić Class.forName. W przeciwnym razie musisz go wywołać, aby zainicjować sterownik.

Jonathan
źródło
1
@JonathanCo masz na myśli, mówiąc „ręcznie załaduj wszystkie sterowniki sprzed wersji JDBC 4.0 metodą Class.forName”, czy możesz wyjaśnić?
Aravind
Te Class.forNamesiły połączeń classloader załadować daną klasę. To jest krok ręcznego ładowania opisany w samouczku.
Jonathan
@Jonathan Dlatego moje połączenie nadal działa bez class.forName();:)
Asif Mushtaq
2

Przed Javą 6 DriverManagerklasa nie wiedziałaby, którego sterownika JDBC chcesz użyć. Class.forName("...")był sposobem na wstępne ładowanie klas sterowników.

Jeśli używasz języka Java 6, nie musisz już tego robić.

Qwerky
źródło
Tak, trzeba użyć: OracleDataSource teraz docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726 i samodzielnie tworzy adres URL: final OracleDataSource ds = new OracleDataSource (); ds.setDriverType ("cienki"); ds.setServerName (nazwa_hosta); ds.setPortNumber (port); //ds.setDatabaseName(dbName); ds.setServiceName (dbName); connection = ds.getConnection (użytkownik, pwd);
Rajesh Goel
1

To polecenie ładuje klasę sterownika Oracle jdbc, aby była dostępna dla instancji DriverManager. Po załadowaniu klasy system może połączyć się z Oracle używając jej. Alternatywnie możesz użyć metody registerDriver programu DriverManager i przekazać ją z instancją sterownika JDBC, której potrzebujesz.

anatolich
źródło
0

Użyj oracle.jdbc.OracleDriver, a nie oracle.jdbc.driver.OracleDriver. Nie musisz go rejestrować, jeśli plik jar sterownika znajduje się w katalogu „WEB-INF \ lib”, jeśli używasz Tomcat. Zapisz to jako test.jsp i umieść w katalogu sieciowym, a następnie ponownie wdróż folder aplikacji internetowej w menedżerze 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
        }
    }
}

%>
Tomek
źródło