2016-06-17 3 views
9

От Java documentationClass.forName все еще кажется необходимым

В предыдущих версиях JDBC, чтобы получить соединение, вы сначала должны были инициализировать драйвер JDBC с помощью вызова метода Class.forName.

Все драйверы JDBC 4.0, которые находятся в вашем пути к классу, автоматически загружаются. (Тем не менее, вы должны вручную загрузить все драйверы до до JDBC 4.0 с помощью метода Class.forName.)

У меня есть джерси WebService, который подключается к SQL Server Express 2016. Он имеет sqljdbc42.jar что 4,2 драйвера, в CLASSPATH

Однако, если опустить Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver") вызов, мой DriverManager.getConnection не бросает SQLException (нет подходящего драйвера найден для JDBC: SQLServer: // Localhost: 1433; .... ")

The getConnection начинается после того, как я добавлю Class.forName.

Я нахожусь на Java 8.

Что мне не хватает?

UPDATE: Я просто попробовал программу командной строки, и она работает без forName. Однако из моей Eclipse IDE, где я запускаю службу REST в качестве сервера Tomcat 8.0 на локальном хосте, он не работает.

+1

* "... sqljdbc42.jar, который является драйвером 4.0" * [Доказательство здесь] (https://msdn.microsoft.com/en-us/library/ms378422 (v = sql.110) .aspx), для любых скептиков. :-) Ну, ладно, это не драйвер 4.0, это 4.2-драйвер, но ... –

+1

@TJCrowder обновлен :-) – user93353

+1

Если так, похоже, Microsoft не любит следовать стандартам –

ответ

6

Драйверы автоматически инициализируются, когда класс DriverManager сам инициализируется благодаря SPI (интерфейс поставщика услуг). Это означает, что внутри он попытается найти любой файл META-INF/services/java.sql.Driver, доступный в загрузчике класса контекста, и для каждого найденного файла он создаст экземпляр класса, который определен в файле, который в этом случае фактически является FQN драйвера JDBC , так как драйверы JDBC автоматически инициализируются начиная с JDBC 4.0.

Но это может работать только в том случае, если ваш драйвер доступен из загрузчика класса контекста при инициализации класса DriverManager. Хороший способ убедиться, что ваш драйвер доступен с Class Loader, достаточно высоким в иерархии. В вашем случае вы должны поставить свой драйвер в tomcat/lib. Действительно, таким образом ваш драйвер будет доступен с Common CL, который должен быть достаточно высоким. Подробнее о иерархии CL в Tomcat here.

Смежные вопросы