Понимание внутренних особенностей JDBC - PullRequest
3 голосов
/ 06 ноября 2008

[1] В JDBC, почему мы должны сначала загружать драйверы, используя Class.forName («некоторое имя драйвера»). Почему SUN не позаботился о загрузке драйвера внутри самого метода getConnection (). Если я передаю имя драйвера в качестве параметра методу getConnection ().

[2] Я хочу понять внутренности JBDC. Любые указания на это приветствуются.

Ответы [ 3 ]

8 голосов
/ 06 ноября 2008

В JDBC 4 вам больше не нужно использовать Class.forName (...), см. здесь для одной статьи, объясняющей это:

Для подключения к базе данных требуется, чтобы в виртуальную машину клиента был загружен подходящий драйвер базы данных JDBC. В первые дни JDBC было принято загружать подходящий драйвер через Class.forName (), передавая имя класса, реализующего интерфейс драйвера JDBC. Позже класс DriverManager предложил более гибкие средства управления драйверами JDBC в клиентском приложении. Чтобы драйвер стал доступным, нужно было вызвать registerDriver () DriverManager с именем класса драйвера. В качестве альтернативы вы можете указать драйверы для загрузки через системное свойство jdbc.drivers. Когда DriverManager инициализируется, он пытается загрузить драйверы, связанные с этим свойством.

JDBC 4 добавляет механизм *1000* поставщика услуг в качестве другого средства указания драйверов базы данных. Чтобы это работало, файлы JAR драйвера должны включать файл META-INF / services / java.sql.driver. Этот файл должен содержать одну строку с именем реализации драйвера JDBC интерфейса драйвера. Вызов getConnection () в DriverManager загрузит драйвер, упакованный таким образом, если это необходимо. После загрузки драйвера создается экземпляр драйвера, а затем вызывается registerDriver (), чтобы сделать этот драйвер доступным для клиентов.

Посмотрите JDBC-ссылку Sun для получения дополнительной информации о JDBC. Спецификация JDBC 4.0 относительно приятна для чтения по сравнению с некоторыми другими спецификациями ...

1 голос
/ 06 ноября 2008

java.sql не может узнать, какой класс загрузить, если вы дадите ему только имя протокола JDBC. Возможно, JAR-файлы драйвера JDBC должны указывать имя протокола и класс драйвера в своем манифесте или в другом месте в META-INF /. По моему мнению, вы могли бы также сконструировать экземпляр драйвера самостоятельно, вместо того, чтобы пытаться загрузить класс с помощью зашитой строки или файла служб fiddly.

В самом JDBC нет ничего особенного. Источник находится в src.zip JDK. DriverManager - это класс с кодом.

0 голосов
/ 10 ноября 2008

Инструментарий был прав. Начиная с JDBC 4.0 существует механизм, при котором драйверы автоматически регистрируются, используя J2SE Service Provider . К сожалению, не все поставщики JDBC обновили свои драйверы для этого. Я также думаю, что в настоящее время не так много драйверов JDBC, поддерживающих JDBC 4.0. Между тем вам нужно будет создать экземпляр драйвера для регистрации драйвера. Затем DriverManager проверит каждый зарегистрированный драйвер, принимает ли он URL JDBC, переданный для DriverManager.getConnection (). Вы можете включить ведение журнала драйверов, чтобы увидеть, что произойдет, если драйвер был зарегистрирован, а DriverManager попытается найти подходящий драйвер. Поэтому просто вызовите DriverManager.setLogStream () или DriverManager.setLogWriter () перед этим.

Это один из известных мне драйверов JDBC 4.0: http://www.inetsoftware.de/products/jdbc/mssql/merlia

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...