OSGI中的JDBC驱动程序问题

时间:2011-02-08 06:40:22

标签: java mysql jdbc osgi

我正在尝试让OSGI包访问MYSQL数据库,使用Eclipse作为我的IDE(Windows 7 x64)。我能够加载jdbc连接器。实际的.jar放在java安装目录的所有\ bin文件夹中,以及bundle的\ bin文件夹。我也将环境类路径变量设置为此文件夹。我有一个错误说明驱动程序不适合。我知道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 个答案:

答案 0 :(得分:3)

在您的代码段中,您获得了SystemClassLoader,并且您要求"com.mysql.jdbc.Driver"。鉴于该调用没有给你ClassNotFoundException,我们可以得出结论系统类加载器可以为你找到类;然后,驱动程序将自己注册到DriverManager

但是,您看不到MySQL驱动程序所做的DriverManager! MySQL驱动程序从系统类加载器中看到一个,但是您的代码(conn = DriverManager. ...)使用bundle自己的类加载器中的代码。这是两个不同的类,因此找不到合适的驱动程序。

我的解决方案是使用SystemClassLoader(无论如何你不应该在OSGi中做,除非你确切知道你在做什么),但是使用bundle的类加载器。所以,我会

  • 没有将MySQL jar放在系统类路径上,但让OSGi做了很多工作。您可以将jar放在一个包中,然后将jar放在Bundle-ClassPath上。然后,您可以选择将其保密至您的捆绑包(如果您是唯一使用它的人),或者导出包。
  • 不使用系统类加载器,而是使用bundle的类加载器。这可以像使用Class.forName("com.mysql.jdbc.Driver")一样简单;这样做会做对的。