我正在尝试让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驱动程序创建一个单独的包,并将其导出/导入到相应的包中,但没有运气。
由于
答案 0 :(得分:3)
在您的代码段中,您获得了SystemClassLoader
,并且您要求"com.mysql.jdbc.Driver"
。鉴于该调用没有给你ClassNotFoundException
,我们可以得出结论系统类加载器可以为你找到类;然后,驱动程序将自己注册到DriverManager
。
但是,您看不到MySQL驱动程序所做的DriverManager
! MySQL驱动程序从系统类加载器中看到一个,但是您的代码(conn = DriverManager. ...
)使用bundle自己的类加载器中的代码。这是两个不同的类,因此找不到合适的驱动程序。
我的解决方案是不使用SystemClassLoader
(无论如何你不应该在OSGi中做,除非你确切知道你在做什么),但是使用bundle的类加载器。所以,我会
Bundle-ClassPath
上。然后,您可以选择将其保密至您的捆绑包(如果您是唯一使用它的人),或者导出包。Class.forName("com.mysql.jdbc.Driver")
一样简单;这样做会做对的。