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?
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?
A
której wywołuję konstruktor Class.forName("oracle.jdbc.driver.OracleDriver")
klasy A
i tworzę A's
obiekt, 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?
Odpowiedzi:
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 typujava.sql.Driver
. Każdy sterownik JDBC zawiera co najmniej jedną klasę implementującą interfejsjava.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.0Class.forName
).
Class.forName()
bez przechwytywania odniesienia do zwróconej klasy driverClass, więc na pierwszy rzut oka wydaje się, że operacja nie działa
Class.forName("etc.driver")
?
Class.forName(...)
.
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.0Class.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.
Class.forName
siły połączeń classloader załadować daną klasę. To jest krok ręcznego ładowania opisany w samouczku.
class.forName();
:)
Przed Javą 6 DriverManager
klasa 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ć.
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.
Alternatywą byłoby użycie właściwości systemowej jdbc.drivers do określenia wymaganych sterowników w wierszu komend podczas uruchamiania maszyny JVM.
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
}
}
}
%>