2015-03-25 1 views
1

Всякий раз, когда я запускаю следующий код:JDBC драйвер не загружается должным образом в Java

public void insertIntoMysql() { 

    URLClassLoader childCl = new URLClassLoader(new URL[] {new URL("file:///myProjectDir/lib/mysql-connector-java-5.0.8-bin.jar")}, this.getClass().getClassLoader()); 

    try { 
     // connect to mysql 
     Class.forName("com.mysql.jdbc.Driver", true, childCl); 
     String myUrl = "jdbc:mysql://localhost:3306/myDB"; 
     Connection conn = DriverManager.getConnection(myUrl, "root", "adminpw"); 

     ... 
    } catch { 
     ... 
    } 
} 

Я получаю «java.sql.SQLException: Нет подходящего драйвера найти для JDBC: MySQL: // локальный: 3306/myDB "при вызове DriverManager.

Я предполагаю, что это связано с тем, что я загрузил свой драйвер с помощью специального загрузчика классов (я не могу изменить вызывающий код, поэтому не могу изменить путь к классам, который загружается, когда мой скрипт называется). Кажется, что драйвер отлично подходит для класса Class.forName, но это похоже на тот класс, который никогда не был загружен только двумя строками позже.

Любые мысли?

--- UPDATE ---

Я понял, как добавить баночку моего пути к классам во время выполнения, используя BeanShell Util, удален устаревший forName и перестал использовать специальный загрузчик классов. Мой обновленный код ниже:

import com.mysql.jdbc.Driver; 

public void insertIntoMysql() { 

    try { 
     addClassPath("/lib/mysql-connector-java-5.0.8-bin.jar"); 
     // printing out the classpath URLs here shows several 
     // jar files along with the one I just added: 
     // file:/C:/myProjectDir/lib/mysql-connector-java-5.0.8-bin.jar 

     // connect to mysql 
     String myUrl = "jdbc:mysql://localhost:3306/myDB"; 
     Connection conn = DriverManager.getConnection(myUrl, "root", "adminpw"); 

     ... 
    } catch { 
     ... 
    } 
} 

Однако, я все еще получаю ту же SQLException, что я первоначально получаю хотя мой класс путь был обновлен.

Я также попытался вызвать метод reloadClasses() «BeanShell» сразу после добавления нового пути к классам, но безрезультатно.

+0

Является ли «/myProjectDir/lib/mysql-connector-java-5.0.8-bin.jar» абсолютный путь к банку? – javajavajava

+0

Yup it. Я знаю, что это плохая форма, но я буду беспокоиться о ее очистке, когда я получу эту работу. – exxodus7

+0

Зачем вам нужен пользовательский загрузчик классов? Вы можете удалить эту строку и просто вызвать Class.forName («com.mysql.jdbc.Driver»)? – javajavajava

ответ

2

Да, это связано с пользовательским загрузчиком классов, используемым для загрузки класса. Это также упоминается в Javadocs из DriverManager:

Когда метод getConnection вызывается, то DriverManager попытается найти подходящий драйвер из числа тех, загружается при инициализации и те загружены явно с помощью же загрузчика классов как текущий апплет или приложение.

+0

Да, так как я не могу изменить код вызова (и, следовательно, я думаю, главный загрузчик классов), то DriverManager никогда не будет работать? Это объясняет мне, почему мой код не работает (спасибо!), Но есть ли решение? – exxodus7

+0

@ exxodus7 Не могли бы вы подробнее рассказать о том, как вы это используете в своем вопросе? Зачем вам нужен пользовательский загрузчик классов? – manouti

+0

@ exxodus7 Вы должны изменить код вызова. Это не работает. Он никогда не работал. Это никогда не сработает. Это бесполезно. – EJP

0

Файл банка должен быть в вашем

классов
+0

Точно. Оказалось бессмысленным необъяснимым неправильным нисходящим. – EJP

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

  • Нет связанных вопросов^_^