2011-02-08 5 views
1

Я пытаюсь получить пакет OSGI для доступа к базе данных MYSQL, используя Eclipse в качестве моей IDE (Windows 7 x64). Я могу загрузить разъем jdbc. Фактический .jar помещается во все папки \ bin в каталогах установки java вместе с папкой \ bin пакета. Я также установил переменную classpathpath в эту папку. У меня есть ошибка, указывающая, что драйвер не подходит. Я знаю, что OSGI имеет некоторые проблемы с драйверами и т. Д. Может кто-то порекомендовать способ обойти это?Проблема драйвера JDBC в OSGI

ClassLoader DBHCL = ClassLoader.getSystemClassLoader(); 
DBHCL.loadClass("com.mysql.jdbc.Driver"); 
Class.forName("com.mysql.jdbc.Driver", true, DBHCL).newInstance(); 
System.out.println("Class Loaded"); 
//DriverManager.getDriver("jdbc:mysql://localhost/timedb"); 
//System.out.println("Driver Gotten"); 
conn = DriverManager.getConnection(URL + DBName,username,password); 
System.out.println("Connection Created"); 
stmt = conn.createStatement(); 
System.out.println("Statement Created"); 
connFlag = true; 

Console Output, ошибка: OSGi> не начать 7 Data Base Service (MYSQL) Начиная класса Loaded Нет подходящего драйвера найти для JDBC: MySQL: // Localhost/timedb исключение в потоке INSERT "Thread-1" в appliance1 ...

Есть ли у кого-нибудь понимание этой проблемы?

Я попытался сделать отдельный комплект исключительно для драйвера jdbc и экспортировать/импортировать его в соответствующий комплект, но не повезло.

Благодаря

ответ

3

В фрагменте кода, вы получите SystemClassLoader, и вы спросите его для "com.mysql.jdbc.Driver". Учитывая, что этот вызов не дает вам ClassNotFoundException, мы можем заключить, что системный загрузчик классов может найти для вас класс; тогда водитель зарегистрируется на DriverManager.

Однако вы не видите того же DriverManager, что и драйвер MySQL! Драйвер MySQL видит один из системного загрузчика классов, но ваш код (conn = DriverManager. ...) использует тот, который используется у собственного загрузчика классов. Это два разных класса, поэтому подходящий драйвер не найден.

Мое решение было бы не использовать SystemClassLoader (которые вы не должны делать в любом случае OSGi, если вы точно не знаете, что вы делаете), но использовать загрузчик классов сверток в. Итак, я бы

  • не помещал байт MySQL в системный путь к классам, но пусть OSGi выполняет тяжелую работу. Вы можете положить банку в связку и положить банку на Bundle-ClassPath. Затем вы можете выбрать либо сохранить его в своем пакете (если вы используете его только один), либо экспортировать пакеты.
  • Вместо использования системного загрузчика классов используйте загрузчик классов. Это может быть так же просто, как использование Class.forName("com.mysql.jdbc.Driver"); это будет сделано правильно.
Смежные вопросы