Здравствуйте, nuro, Вы писали:
N>Благодарю,
N> И ещё, ... для регистрации драйвера просто достаточно написать Class c = ... N> Или же надо что-то ещё? Что считается "хорошим тоном" в данном случае?
плохо не только тем, что неочевидно, зачем загружать класс, а потом его нигде не использовать, но и тем, что в коде идет явная привязка к конкретному JDBC драйверу. Несмотря на то, что код, который использует JDBC, крайне трудно сделать переносимым среди различных баз данных, и поэтому привязка к конкретной базе (и драйверу) все равно будет; я бы предложил вместо этой конструкции использовать системное свойство jdbc.drivers (которое должно содержать список классов JDBC драйверов, разделенных двоеточием).
Дело в том, что Class.forName() приводит к загрузке класса и инициализации его статической части.
В свою очередь многие JDBC драйвера при статической инициализации регистрируют себя в DriverManager'е. Так что все дело в side effect'ах.
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.
D>плохо не только тем, что неочевидно, зачем загружать класс, а потом его нигде не использовать, но и тем, что в коде идет явная привязка к конкретному JDBC драйверу.
Если все-таки идет привязка к конкретной БД, то вместо Class.forName() мне больше нравится:
Здравствуйте, mikkri, Вы писали:
M>А все же чем это будет лучше? А если программу запустить без -Djdbc.drivers или передать несовместимый драйвер? M>Если программа заточена под драйвер от Microsoft, то лучше явно это прописать в коде.
Если нужно программу "заточить" под драйвер от Microsoft, то, безусловно, лучше это явно прописать в коде. Можно даже в нескольких местах.
И ещё, ... для регистрации драйвера просто достаточно написать Class c = ...
Или же надо что-то ещё? Что считается "хорошим тоном" в данном случае?
Здравствуйте, mikkri, Вы писали:
M>Дело в том, что Class.forName() приводит к загрузке класса и инициализации его статической части. M>В свою очередь многие JDBC драйвера при статической инициализации регистрируют себя в DriverManager'е. Так что все дело в side effect'ах.
N>Благодарю,
N> И ещё, ... для регистрации драйвера просто достаточно написать Class c = ... N> Или же надо что-то ещё? Что считается "хорошим тоном" в данном случае?
Обычно достаточно написать Class.forName("..."); Результат не нужно никуда присваивать.
Для некоторых драйверов нужно создавать инстанс, так как они инициализируются в конструкторе.
В этом случае код будет Class.forName("...").newInstance(); — это самый надежный вариант.
D>плохо не только тем, что неочевидно, зачем загружать класс, а потом его нигде не использовать, но и тем, что в коде идет явная привязка к конкретному JDBC драйверу. Несмотря на то, что код, который использует JDBC, крайне трудно сделать переносимым среди различных баз данных, и поэтому привязка к конкретной базе (и драйверу) все равно будет; я бы предложил вместо этой конструкции использовать системное свойство jdbc.drivers (которое должно содержать список классов JDBC драйверов, разделенных двоеточием). D>
А все же чем это будет лучше? А если программу запустить без -Djdbc.drivers или передать несовместимый драйвер?
Если программа заточена под драйвер от Microsoft, то лучше явно это прописать в коде.