В чем смысл: Class.forName("..."); ?
От: nuro Россия  
Дата: 03.08.05 04:56
Оценка:
Приветствую,

Расскажите, в чем глубинный смысл следующей строчки:
Class c = Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");


Почему без неё не работает это? Как понимать создание переменной c? Она нигде после не используется!
Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://server:1433","login","pass");
Re: В чем смысл: Class.forName("..."); ?
От: mikkri Великобритания  
Дата: 03.08.05 05:11
Оценка: 2 (1)
Здравствуйте, nuro, Вы писали:

N>Приветствую,


N> Расскажите, в чем глубинный смысл следующей строчки:

N>
Class c = Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");


N> Почему без неё не работает это? Как понимать создание переменной c? Она нигде после не используется!

N>
Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://server:1433","login","pass");


Дело в том, что Class.forName() приводит к загрузке класса и инициализации его статической части.
В свою очередь многие JDBC драйвера при статической инициализации регистрируют себя в DriverManager'е. Так что все дело в side effect'ах.
Re[2]: В чем смысл: Class.forName("..."); ?
От: nuro Россия  
Дата: 03.08.05 05:16
Оценка:
Благодарю,

И ещё, ... для регистрации драйвера просто достаточно написать Class c = ...
Или же надо что-то ещё? Что считается "хорошим тоном" в данном случае?

Здравствуйте, mikkri, Вы писали:

M>Дело в том, что Class.forName() приводит к загрузке класса и инициализации его статической части.

M>В свою очередь многие JDBC драйвера при статической инициализации регистрируют себя в DriverManager'е. Так что все дело в side effect'ах.
Re[3]: В чем смысл: Class.forName("..."); ?
От: mikkri Великобритания  
Дата: 03.08.05 05:24
Оценка:
Здравствуйте, nuro, Вы писали:


N>Благодарю,


N> И ещё, ... для регистрации драйвера просто достаточно написать Class c = ...

N> Или же надо что-то ещё? Что считается "хорошим тоном" в данном случае?

Обычно достаточно написать Class.forName("..."); Результат не нужно никуда присваивать.
Для некоторых драйверов нужно создавать инстанс, так как они инициализируются в конструкторе.
В этом случае код будет Class.forName("...").newInstance(); — это самый надежный вариант.
Re[3]: В чем смысл: Class.forName("..."); ?
От: dshe  
Дата: 03.08.05 06:45
Оценка: 3 (2)
Здравствуйте, nuro, Вы писали:

N>Благодарю,


N> И ещё, ... для регистрации драйвера просто достаточно написать Class c = ...

N> Или же надо что-то ещё? Что считается "хорошим тоном" в данном случае?

Использование конструкции
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

плохо не только тем, что неочевидно, зачем загружать класс, а потом его нигде не использовать, но и тем, что в коде идет явная привязка к конкретному JDBC драйверу. Несмотря на то, что код, который использует JDBC, крайне трудно сделать переносимым среди различных баз данных, и поэтому привязка к конкретной базе (и драйверу) все равно будет; я бы предложил вместо этой конструкции использовать системное свойство jdbc.drivers (которое должно содержать список классов JDBC драйверов, разделенных двоеточием).
java -Djdbc.drivers=com.microsoft.jdbc.sqlserver.SQLServerDriver:foo.bah.Driver:wombat.sql.Driver MyProgram
--
Дмитро
Re[4]: В чем смысл: Class.forName("..."); ?
От: mikkri Великобритания  
Дата: 03.08.05 07:23
Оценка:
Здравствуйте, dshe, Вы писали:

D>Использование конструкции

D>
D>Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
D>

D>плохо не только тем, что неочевидно, зачем загружать класс, а потом его нигде не использовать, но и тем, что в коде идет явная привязка к конкретному JDBC драйверу. Несмотря на то, что код, который использует JDBC, крайне трудно сделать переносимым среди различных баз данных, и поэтому привязка к конкретной базе (и драйверу) все равно будет; я бы предложил вместо этой конструкции использовать системное свойство jdbc.drivers (которое должно содержать список классов JDBC драйверов, разделенных двоеточием).
D>
D>java -Djdbc.drivers=com.microsoft.jdbc.sqlserver.SQLServerDriver:foo.bah.Driver:wombat.sql.Driver MyProgram
D>


А все же чем это будет лучше? А если программу запустить без -Djdbc.drivers или передать несовместимый драйвер?
Если программа заточена под драйвер от Microsoft, то лучше явно это прописать в коде.
Re[5]: В чем смысл: Class.forName("..."); ?
От: dshe  
Дата: 03.08.05 08:20
Оценка: :)
Здравствуйте, mikkri, Вы писали:

M>А все же чем это будет лучше? А если программу запустить без -Djdbc.drivers или передать несовместимый драйвер?

M>Если программа заточена под драйвер от Microsoft, то лучше явно это прописать в коде.

Если нужно программу "заточить" под драйвер от Microsoft, то, безусловно, лучше это явно прописать в коде. Можно даже в нескольких местах.
--
Дмитро
Re[4]: В чем смысл: Class.forName("..."); ?
От: Denis Popov Россия http://picasaweb.google.com/denislpopov
Дата: 03.08.05 09:41
Оценка: 1 (1)
Здравствуйте, dshe, Вы писали:

D>Использование конструкции

D>
D>Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
D>

D>плохо не только тем, что неочевидно, зачем загружать класс, а потом его нигде не использовать, но и тем, что в коде идет явная привязка к конкретному JDBC драйверу.

Если все-таки идет привязка к конкретной БД, то вместо Class.forName() мне больше нравится:

DriverManager.registerDriver(new com.microsoft.jdbc.sqlserver.SQLServerDriver());
Re: В чем смысл: Class.forName("..."); ?
От: fessa  
Дата: 03.08.05 11:37
Оценка: 2 (1)
Здравствуйте, nuro, Вы писали:

N>Приветствую,


N> Расскажите, в чем глубинный смысл следующей строчки:

N>
Class c = Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");


N> Почему без неё не работает это? Как понимать создание переменной c? Она нигде после не используется!

N>
Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://server:1433","login","pass");


From: Java Data Access — JDBC, JNDI, and JAXP. Todd M. Thomas

in your application you must always register a driver when working with JDBC. You can do this using either:
· DriverManager.registerDriver(Driver driverClassName) method
· Class.forName(String driverClassName) method

The Class.forName() method affords more flexibility because it accepts a String parameter representing the
driver class name. This enables you to dynamically obtain driver values at runtime from the command line or
a properties file. Using DriverManager.registerDriver() method requires a parameter of type Driver. Generally
you must hard code the fully−qualified path name for the parameter, which limits your flexibility.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.