我正在尝试使用 Eclipse 作为我的 IDE (Windows 7 x64),让 OSGI bundle 访问 MYSQL DB。我能够加载 jdbc 连接器。实际的 .jar 与 bundle 的\bin 文件夹一起放置在 java 安装目录中的所有\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 驱动程序创建一个单独的 bundle ,并将其导出/导入到适当的 bundle 中,但没有成功。
谢谢
最佳答案
在您的代码片段中,您将获得SystemClassLoader
,并向其请求“com.mysql.jdbc.Driver”
。鉴于该调用不会给您带来 ClassNotFoundException
,我们可以得出结论,系统类加载器可以为您找到该类;然后,驱动程序会将自身注册到 DriverManager
。
但是,您看不到与 MySQL 驱动程序相同的 DriverManager
! MySQL 驱动程序看到来自系统类加载器的类加载器,但您的代码 (conn = DriverManager. ...
) 使用来自 bundle 自己的类加载器的类加载器。这是两个不同的类,因此没有找到合适的驱动程序。
我的解决方案是不使用SystemClassLoader
(无论如何你都不应该在OSGi中这样做,除非你确切地知道你在做什么),而是使用 bundle 的类加载器。所以,我会
- 不要将 MySQL jar 放在系统类路径中,而是让 OSGi 来完成艰苦的工作。您可以将 jar 放入包中,并将 jar 放在
Bundle-ClassPath
上。然后,您可以选择将其保留为您的包的私有(private)(如果您是唯一使用它的人),或导出包。 - 不要使用系统类加载器,而是使用 bundle 的类加载器。这可以像使用 Class.forName("com.mysql.jdbc.Driver") 一样简单;这会做正确的事情。
关于java - OSGI中的JDBC驱动程序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4930299/