OSGI中的JDBC驱动程序问题

OSGI中的JDBC驱动程序问题

问题描述:

我试图让OSGI包使用Eclipse作为我的IDE(Windows 7 x64)访问MYSQL数据库。我能够加载jdbc连接器。实际的.jar被放在java安装目录的所有\ bin文件夹中,以及该软件包的\ bin文件夹中。我也将环境类路径变量设置为该文件夹。我有一个错误,指出该驱动程序不适合。我知道OSGI有一些与司机等问题。有人可以推荐一种方法来绕过这个?OSGI中的JDBC驱动程序问题

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的>开始7数据基础服务(MYSQL)原类加载找到JDBC没有合适的驱动程序:MySQL的://本地主机/ timedb异常在线程 “线程1” INSERT INTO appliance1 ...

有没有人有任何洞察到这个问题?

我已经尝试单独为jdbc驱动程序创建一个单独的包并将其导出/导入到相应的包,但没有运气。

感谢

在您的代码段,你得到的SystemClassLoader了,你问它的"com.mysql.jdbc.Driver"。鉴于该调用不会给你一个ClassNotFoundException,我们可以得出结论,系统类加载器可以为你找到类;司机将注册到DriverManager

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

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

  • 不把MySQL jar放在系统类路径上,但让OSGi做了很多努力。你可以把这个罐子放在一个包里,然后把罐子放在Bundle-ClassPath上。然后,您可以选择将其保留为您的包(如果您是唯一使用它的包),或者导出包。
  • 代替使用系统类加载器,请使用该包的类加载器。这可以像使用Class.forName("com.mysql.jdbc.Driver")一样简单;这将做正确的事情。