我尝试连接到我的MySQL数据库,但是由于OSGI的类加载器Hirachie,使用Class.forname()的常规方法不起作用。我不知道该怎么做。
答案 0 :(得分:0)
看看Pax JDBC:https://ops4j1.jira.com/wiki/display/PAXJDBC/MySQL+Driver+Adapter
这将为MySQL数据库注册一个DataSourceFactory,然后您可以使用它来创建DataSource。见http://www.osgi.org/javadoc/r4v42/org/osgi/service/jdbc/DataSourceFactory.html
我认为Pax JDBC MySql驱动程序有一些限制,它没有完全实现规范,所以请仔细阅读说明。
答案 1 :(得分:0)
在OSGi中,bundle的类加载器只能看到它的清单中由该bundle显式导入的包。因此,Class.forname不适用于未导入的包。
直接的解决方案是在com.mysql.jdbc包的清单中添加Import-Package标头。如果您尝试加载(例如)com.mysql.jdbc.Driver,它将起作用。
为JDBC驱动程序添加显式Import-Packages将导致无法在不更改import-package标头的情况下切换驱动程序。为此,您可以考虑使用DynamicImport-Package:*。这将允许bundle在bundle连接后找到类。请注意,在大多数情况下,永远不应该使用它,因为现在您又回到了运行时类加载OSGi通常会阻止的异常的可能性。对于JDBC,它可以是正确的解决方案。