【问题标题】:JDBC driver problem in OSGIOSGI 中的 JDBC 驱动程序问题
【发布时间】:2011-06-23 06:02:13
【问题描述】:

我正在尝试使用 Eclipse 作为我的 IDE (Windows 7 x64) 让 OSGI 包访问 MYSQL DB。我能够加载 jdbc 连接器。实际的 .jar 与包的 \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> 启动 7 数据库服务 (MYSQL) 启动类已加载没有为 jdbc:mysql://localhost/timedb 找到合适的驱动程序线程“Thread-1”中的异常 INSERT INTO appliance1...

有人对这个问题有任何见解吗?

我尝试为 jdbc 驱动程序单独制作一个单独的包并将其导出/导入到适当的包中,但没有成功。

谢谢

【问题讨论】:

    标签: java mysql jdbc osgi


    【解决方案1】:

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

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

    我的解决方案是使用SystemClassLoader(无论如何你都不应该在OSGi 中这样做,除非你确切地知道自己在做什么),而是使用捆绑包的类加载器。所以,我会

    • 不要将 MySQL jar 放在系统类路径中,而是让 OSGi 来完成这项艰苦的工作。您可以将罐子放在一个捆绑包中,然后将罐子放在Bundle-ClassPath 上。然后,您可以选择将其保密(如果您是唯一使用它的人),或者将其导出。
    • 不要使用系统类加载器,而是使用捆绑包的类加载器。这可以像使用Class.forName("com.mysql.jdbc.Driver") 一样简单;这会做正确的事。

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 2011-06-16
      • 2012-03-10
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 2012-02-28
      • 2012-12-27
      • 2017-07-15
      相关资源
      最近更新 更多