powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Зачем Class.forName(sDriver).newInstance() при коннекте к БД
7 сообщений из 7, страница 1 из 1
Зачем Class.forName(sDriver).newInstance() при коннекте к БД
    #38222718
PRince_SOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос наверное покажется нубским, но все же.
Собственно имеется код, честно списанный и переделанный от другого человека:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
public class DBUtils {
    private String sURL ,sLogin, sPwd, sDriver = "oracle.jdbc.driver.OracleDriver";
    private Connection cConn;
    
    public DBUtils(String ConURL, String Login, String Pwd, String Driver){
        super();
        if(!Driver.isEmpty())
            sDriver = Driver;
        sURL = ConURL;
        sLogin = Login;
        sPwd = Pwd;
    }
 . . . . . . . . . .   
    private Connection getConnection(){
        try 
        {
            Class.forName(sDriver).newInstance();                           //<-----------
            Connection con = DriverManager.getConnection(sURL, sLogin, sPwd);
            return con;
        } 
        catch (Exception ex) 
        {
            System.out.println("Error getConnection: " + ex.toString());
        }
        return null;
    }
 . . . . . . . . . . 



так вот интересует зачем в методе getConnection вызывается
Код: java
1.
Class.forName(sDriver).newInstance(); 


и, так сказать, уходит в провода?

или же в этом есть некий тайный смысл?
...
Рейтинг: 0 / 0
Зачем Class.forName(sDriver).newInstance() при коннекте к БД
    #38222721
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этим способом мы говорим JVM, а ну-ка загрузи и инициализируй нам данный класс. Класс-драйвер тоже не дурак, во время инициализации регистрирует себя в DriverManager. Некоторые старые драйвера не регистрировали себя через статический инициализатор. Поэтому Class.forName для них не достаточно. newInstance() вызывает дефолтный конструктор, который и регестрирует драйвера в DriverManager-е. Современным драйверам newInstance() делать не обязательно. Просто страховка на "мало ли что".

В промышленном программировании этот код вообще не применяется. Потому что в любых Enterprise системах используются фреймверки и API, которые это всё сами делают из указанных им настроек.
...
Рейтинг: 0 / 0
Зачем Class.forName(sDriver).newInstance() при коннекте к БД
    #38222724
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PRince_SOT,
Есть смысл. newInstance() там не нужно, а Class.forName(sDriver) загружает драйвер, выполняется статический метод драйвера, который регистрирует его в DriverManager. После этого им можно пользоваться.
...
Рейтинг: 0 / 0
Зачем Class.forName(sDriver).newInstance() при коннекте к БД
    #38222730
PRince_SOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть, если я уберу эту строчку - при попытке коннекта у меня все рухнет? Интересно...
Спасибо!
...
Рейтинг: 0 / 0
Зачем Class.forName(sDriver).newInstance() при коннекте к БД
    #38222739
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PRince_SOT,
Рухнет, если драйвер ниже JDBC 4.0, иначе зарегистрируется без вашей помощи.
...
Рейтинг: 0 / 0
Зачем Class.forName(sDriver).newInstance() при коннекте к БД
    #38224419
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЭтим способом мы говорим JVM, а ну-ка загрузи и инициализируй нам данный класс. Класс-драйвер тоже не дурак, во время инициализации регистрирует себя в DriverManager. Некоторые старые драйвера не регистрировали себя через статический инициализатор. Поэтому Class.forName для них не достаточно. newInstance() вызывает дефолтный конструктор, который и регестрирует драйвера в DriverManager-е. Современным драйверам newInstance() делать не обязательно. Просто страховка на "мало ли что".
..

Воoбще-то драйвера всегда обязаны были себя регистрировать именно через static-инициализатор.
java.sql.Driver JDBC 1.0When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager. This means that a user can load and register a driver by doing Class.forName("foo.bah.Driver").

Если какие-то старые драйвера не делают так, как обязаны, если уж называют себя JDBC-драйверами, то смысл рассчитывать на что-то что они и делать-то необязаны? Мне кажется, что Class.forName("foo.bah.Driver") было достаточно всегда, а newInstance() было излишним всегда.
...
Рейтинг: 0 / 0
Зачем Class.forName(sDriver).newInstance() при коннекте к БД
    #38224592
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J.SergeЕсли какие-то старые драйвера не делают так, как обязаны, если уж называют себя JDBC-драйверами, то смысл рассчитывать на что-то что они и делать-то необязаны? Мне кажется, что Class.forName("foo.bah.Driver") было достаточно всегда, а newInstance() было излишним всегда.
В теории всё так. На практике - не всегда.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Зачем Class.forName(sDriver).newInstance() при коннекте к БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]