Що буде команда
Class.forName("oracle.jdbc.driver.OracleDriver")
саме під час підключення до бази даних Oracle? Чи є альтернативний спосіб зробити те саме?
Що буде команда
Class.forName("oracle.jdbc.driver.OracleDriver")
саме під час підключення до бази даних Oracle? Чи є альтернативний спосіб зробити те саме?
A
де я викликаю конструктор Class.forName("oracle.jdbc.driver.OracleDriver")
класів A
, і я створюю A's
об'єкт для отримання поля з'єднання для кожного сервлету, де мені потрібне з'єднання, тоді Java пропустить Class.forName("oracle.jdbc.driver.OracleDriver")
або завантажиться знову?
Відповіді:
Він отримує посилання на об'єкт класу з 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
.)
Class.forName()
не захопивши посилання на повернутий клас driverSlass, тому на перший погляд це здається операцією без операції
Class.forName("etc.driver")
?
Class.forName(...)
.
У попередніх версіях JDBC, щоб отримати з'єднання, спочатку потрібно було ініціалізувати драйвер JDBC, викликавши метод
Class.forName
. Будь-які драйвери JDBC 4.0, знайдені у вашому шляху до класу, завантажуються автоматично. (Однак потрібно вручну завантажувати всі драйвери до JDBC 4.0 методомClass.forName
.)
Отже, якщо ви використовуєте драйвер Oracle 11g (11.1) з Java 1.6, вам не потрібно телефонувати Class.forName
. В іншому випадку вам потрібно зателефонувати йому, щоб ініціалізувати драйвер.
Class.forName
силах виклику завантажувач класів для завантаження даного класу. Це крок ручного завантаження, описаний у підручнику.
class.forName();
:)
До 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
}
}
}
%>