Проблема с драйвером JDBC в OSGI - PullRequest
1 голос
/ 08 февраля 2011

Я пытаюсь получить доступ к базе данных OSGI к базе данных MYSQL, используя Eclipse в качестве среды IDE (Windows 7 x64). Я могу загрузить разъем JDBC. Фактический файл .jar помещается во все папки \ bin в каталогах установки java вместе с папкой \ bin комплекта. Я также установил переменную classpath среды в эту папку. У меня есть ошибка, утверждающая, что драйвер не подходит. Я знаю, что у 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;

Вывод на консоль, ошибка: osgi> start 7 Служба базы данных (MYSQL) Начальный класс загружен Не найдено подходящего драйвера для jdbc: mysql: // localhost / timedb Исключение в потоке "Thread-1" INSERT INTO appliance1 ...

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

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

Спасибо

1 Ответ

3 голосов
/ 02 апреля 2011

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

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

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

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