Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OSGI中的JDBC驱动程序问题_Java_Mysql_Jdbc_Osgi - Fatal编程技术网

Java OSGI中的JDBC驱动程序问题

Java OSGI中的JDBC驱动程序问题,java,mysql,jdbc,osgi,Java,Mysql,Jdbc,Osgi,我试图让一个OSGI包访问MYSQL数据库,使用Eclipse作为我的IDE(Windows7x64)。我能够加载jdbc连接器。实际的.jar与捆绑包的\bin文件夹一起放在java安装目录中的所有\bin文件夹中。我还将环境classpath变量设置为此文件夹。我有一个错误,说司机不合适。我知道OSGI在驱动程序等方面存在一些问题。有人能推荐一种方法来避免这种情况吗 ClassLoader DBHCL = ClassLoader.getSystemClassLoader(); DBHCL.l

我试图让一个OSGI包访问MYSQL数据库,使用Eclipse作为我的IDE(Windows7x64)。我能够加载jdbc连接器。实际的.jar与捆绑包的\bin文件夹一起放在java安装目录中的所有\bin文件夹中。我还将环境classpath变量设置为此文件夹。我有一个错误,说司机不合适。我知道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”插入appliance1时出现异常

有人对这个问题有什么见解吗

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


谢谢

在您的代码片段中,您得到了
系统类加载器
,您要求它提供
“com.mysql.jdbc.Driver”
。假设该调用没有给您一个
ClassNotFoundException
,我们可以断定系统类加载器可以为您找到类;然后,驱动程序将自己注册到
DriverManager

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

我的解决方案是不使用
SystemClassLoader
(除非您确切知道自己在做什么,否则无论如何都不应该在OSGi中使用),而是使用bundle的classloader。所以,我会的

  • 不要将MySQL jar放在系统类路径上,而是让OSGi来完成这项艰巨的工作。您可以将jar放在一个包中,然后将jar放在
    包类路径上。然后,您可以选择将其保留为包的私有(如果您是唯一使用它的人),或者导出包
  • 不要使用系统类加载器,而是使用包的类加载器。这可以像使用
    Class.forName(“com.mysql.jdbc.Driver”)
    一样简单;这样做是对的