Яке фактичне використання Class.forName (“oracle.jdbc.driver.OracleDriver”) під час підключення до бази даних?


91

Що буде команда

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

саме під час підключення до бази даних Oracle? Чи є альтернативний спосіб зробити те саме?


6
Пов’язане: stackoverflow.com/questions/5992126/loading-jdbc-driver Зверніть увагу, що вам потрібно викликати його лише один раз під час запуску програми; вам не потрібно телефонувати щоразу перед тим, як отримати зв’язок протягом життя програми.
BalusC

@BalusC Припустимо, у мене є деталі з'єднання в окремому класі, Aде я викликаю конструктор Class.forName("oracle.jdbc.driver.OracleDriver")класів A, і я створюю A'sоб'єкт для отримання поля з'єднання для кожного сервлету, де мені потрібне з'єднання, тоді Java пропустить Class.forName("oracle.jdbc.driver.OracleDriver")або завантажиться знову?
Асіф Муштак

Відповіді:


68

Він отримує посилання на об'єкт класу з FQCN (повністю кваліфіковане ім'я класу) oracle.jdbc.driver.OracleDriver.

Він нічого не "робить" з точки зору підключення до бази даних, окрім забезпечення того, що вказаний клас завантажується поточним завантажувачем класів . Принципової різниці між письмом немає

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. Кожен драйвер JDBC містить один або кілька класів, що реалізують інтерфейс java.sql.Driver.
...
Будь-які драйвери JDBC 4.0, знайдені у шляху до вашого класу, завантажуються автоматично. (Однак потрібно вручну завантажувати всі драйвери до JDBC 4.0 методом Class.forName.)

Подальше читання (читайте: запитання це дубль)


29
Іншими словами, це дозволяє використовувати клас Driver, не маючи явного імпорту для вашого класу. Це дозволяє створювати проект без необхідності мати драйвер Oracle у своєму класі.
JustinKSU

3
слід зауважити, що "застарілим способом" ви зателефонуєте, Class.forName()не захопивши посилання на повернутий клас driverSlass, тому на перший погляд це здається операцією без операції
matt b

11
Це тому, що драйвер JDBC повинен мати статичний ініціалізатор, який реєструє драйвер у DriverManager. При використанні Class.forName () цей ініціалізатор виконується і драйвер реєструється. З JDBC 4.0 DriverManager сам використовує ServiceLoader для пошуку драйверів на шляху до класу.
Mark Rotteveel

1
@MattBall, Що стосується попередньої версії JDBC 4.0, отримання посилання на драйвер або виклик статичної функції цього класу драйверів вже автоматично завантажує клас драйверів. То чому ми повинні це робити вручну Class.forName("etc.driver")?
Pacerier

1
@Pacerier неправильне припущення. JDBC не знає, який драйвер ви хочете завантажити, тому в JDBC (який є агностичним для драйверів) немає нічого, що може посилатися на клас драйвера. Отже, вам потрібно щось, що ініціює навантаження класу. Я припускаю, що статичний метод буде працювати замість Class.forName(...).
Matt Ball

13

Він реєструє водія; щось у формі:

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

  //etc: implemented methods
}

6

З підручника Java JDBC :

У попередніх версіях JDBC, щоб отримати з'єднання, спочатку потрібно було ініціалізувати драйвер JDBC, викликавши метод Class.forName. Будь-які драйвери JDBC 4.0, знайдені у вашому шляху до класу, завантажуються автоматично. (Однак потрібно вручну завантажувати всі драйвери до JDBC 4.0 методом Class.forName.)

Отже, якщо ви використовуєте драйвер Oracle 11g (11.1) з Java 1.6, вам не потрібно телефонувати Class.forName. В іншому випадку вам потрібно зателефонувати йому, щоб ініціалізувати драйвер.


1
@JonathanЩо ви маєте на увазі під "вручну завантажувати будь-які драйвери до JDBC 4.0 методом Class.forName", чи можете ви пояснити?
Aravind

В Class.forNameсилах виклику завантажувач класів для завантаження даного класу. Це крок ручного завантаження, описаний у підручнику.
Джонатан

@Jonathan Отже, ось чому мій зв’язок все ще працює без class.forName();:)
Асіф Муштак

2

До Java 6 DriverManagerклас не знав би, який драйвер JDBC ви хочете використовувати. Class.forName("...")був способом попереднього завантаження класів драйверів.

Якщо ви використовуєте Java 6, вам більше не потрібно цього робити.


Так, потрібно використовувати: OracleDataSource тепер docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726 і він робить URL-адресу самостійно: final OracleDataSource ds = new OracleDataSource (); ds.setDriverType ("тонкий"); ds.setServerName (ім'я хоста); ds.setPortNumber (порт); //ds.setDatabaseName(dbName); ds.setServiceName (dbName); connection = ds.getConnection (user, pwd);
Rajesh Goel

1

Ця команда завантажує клас драйвера Oracle jdbc, щоб бути доступним для екземпляра DriverManager. Після завантаження класу система може підключитися до Oracle, використовуючи його. В якості альтернативи ви можете використовувати метод registerDriver DriverManager і передати його разом із екземпляром потрібного вам драйвера JDBC.



0

Використовуйте 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
        }
    }
}

%>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.