java - OSGI中的JDBC驱动程序问题

标签 java mysql jdbc osgi

我正在尝试使用 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/

相关文章:

java - 为什么将类注释为@Service 不创建 bean?

mysql - SQL 计数等于 1 个值的记录,并对其余的进行计数和分组

PHP/MySQL - 如果数据库中不存在该行,则包含错误页面

java - JOIN 中的相同列名在 ResultSet 中出现 "column not found"错误

java - UCP工作算法

java - 生成动态 sql SELECT 语句

javascript - Angular : How to send the data to service

java - XML 解析后微调器中的值

mysql - 一对多加入聚合函数(最大)

java - Android 在哪里初始化 Activity 数据?