【问题标题】:JDBC Oracle in OSGI conciergeOSGI concierge 中的 JDBC Oracle
【发布时间】:2018-10-26 00:20:59
【问题描述】:

我需要一些线索如何使用部署为 OSGi Bundle 的 ojdbc8(我尝试使用 ojdbc6,ojdbc7 也从未工作过),我可以使用 Class.load() 加载类,但是运行时出现以下错误:

java.net.MalformedURLException: unknown protocol: bundle
    at java.net.URL.<init>(URL.java:421)
    at java.net.URL.<init>(URL.java:310)
    at java.net.URL.<init>(URL.java:333)
    at org.eclipse.concierge.BundleImpl$Revision.createURL(BundleImpl.java:2460)
    at org.eclipse.concierge.BundleImpl$JarBundleRevision.findFile(BundleImpl.java:3633)
    at org.eclipse.concierge.BundleImpl$JarBundleRevision.lookupFile(BundleImpl.java:3587)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findOwnResources(BundleImpl.java:3220)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource1(BundleImpl.java:2747)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource0(BundleImpl.java:2685)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource(BundleImpl.java:2541)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.getResource(BundleImpl.java:2517)
    at java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:1307)
    at java.lang.Class.getResourceAsStream(Class.java:2223)
    at oracle.jdbc.driver.SQLStateMapping.doGetMappings(SQLStateMapping.java:208)
    at oracle.jdbc.driver.SQLStateMapping.getMappings(SQLStateMapping.java:194)
    at oracle.jdbc.driver.DatabaseError.<clinit>(DatabaseError.java:1075)
    at oracle.jdbc.driver.OracleDiagnosabilityMBean.getDescription(OracleDiagnosabilityMBean.java:96)
    at javax.management.StandardMBean.getMBeanInfo(StandardMBean.java:456)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getNewMBeanClassName(DefaultMBeanServerInterceptor.java:333)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:319)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
    at oracle.jdbc.driver.OracleDriver.registerMBeans(OracleDriver.java:409)
    at oracle.jdbc.driver.OracleDriver$1.run(OracleDriver.java:241)
    at java.security.AccessController.doPrivileged(Native Method)
    at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:237)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at java.sql.DriverManager.isDriverAllowed(DriverManager.java:556)
    at java.sql.DriverManager.getConnection(DriverManager.java:661)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at nz.co.spark.cg.shared.sql.SQLUtils.getDBConnection(SQLUtils.java:19)
    at nz.co.spark.cg.shared.sql.SQLUtils.createLocalDB(SQLUtils.java:29)
    at nz.co.spark.cg.extractor.task.ChatExtractorJob.<init>(ChatExtractorJob.java:61)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:56)
    at org.quartz.simpl.PropertySettingJobFactory.newJob(PropertySettingJobFactory.java:69)
    at org.quartz.core.JobRunShell.initialize(JobRunShell.java:127)
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:375)
java.net.MalformedURLException: unknown protocol: bundle
    at java.net.URL.<init>(URL.java:421)
    at java.net.URL.<init>(URL.java:310)
    at java.net.URL.<init>(URL.java:333)
    at org.eclipse.concierge.BundleImpl$Revision.createURL(BundleImpl.java:2460)
    at org.eclipse.concierge.BundleImpl$JarBundleRevision.findFile(BundleImpl.java:3633)
    at org.eclipse.concierge.BundleImpl$JarBundleRevision.lookupFile(BundleImpl.java:3587)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findOwnResources(BundleImpl.java:3220)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource1(BundleImpl.java:2747)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource0(BundleImpl.java:2685)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource(BundleImpl.java:2541)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.getResource(BundleImpl.java:2517)
    at java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:1307)
    at java.util.ResourceBundle$Control$1.run(ResourceBundle.java:2686)
    at java.util.ResourceBundle$Control$1.run(ResourceBundle.java:2671)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.util.ResourceBundle$Control.newBundle(ResourceBundle.java:2670)
    at java.util.ResourceBundle.loadBundle(ResourceBundle.java:1510)
    at java.util.ResourceBundle.findBundle(ResourceBundle.java:1474)
    at java.util.ResourceBundle.findBundle(ResourceBundle.java:1428)
    at java.util.ResourceBundle.findBundle(ResourceBundle.java:1428)
    at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1370)
    at java.util.ResourceBundle.getBundle(ResourceBundle.java:782)
    at oracle.jdbc.driver.Message11.msg(Message11.java:36)
    at oracle.jdbc.driver.DatabaseError.findMessage(DatabaseError.java:939)
    at oracle.jdbc.driver.OracleDiagnosabilityMBean.getDescription(OracleDiagnosabilityMBean.java:96)
    at javax.management.StandardMBean.getMBeanInfo(StandardMBean.java:456)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getNewMBeanClassName(DefaultMBeanServerInterceptor.java:333)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:319)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
    at oracle.jdbc.driver.OracleDriver.registerMBeans(OracleDriver.java:409)
    at oracle.jdbc.driver.OracleDriver$1.run(OracleDriver.java:241)
    at java.security.AccessController.doPrivileged(Native Method)
    at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:237)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at java.sql.DriverManager.isDriverAllowed(DriverManager.java:556)
    at java.sql.DriverManager.getConnection(DriverManager.java:661)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at nz.co.spark.cg.shared.sql.SQLUtils.getDBConnection(SQLUtils.java:19)
    at nz.co.spark.cg.shared.sql.SQLUtils.createLocalDB(SQLUtils.java:29)
    at nz.co.spark.cg.extractor.task.ChatExtractorJob.<init>(ChatExtractorJob.java:61)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:56)
    at org.quartz.simpl.PropertySettingJobFactory.newJob(PropertySettingJobFactory.java:69)
    at org.quartz.core.JobRunShell.initialize(JobRunShell.java:127)
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:375)
java.net.MalformedURLException: unknown protocol: bundle
    at java.net.URL.<init>(URL.java:421)
    at java.net.URL.<init>(URL.java:310)
    at java.net.URL.<init>(URL.java:333)
    at org.eclipse.concierge.BundleImpl$Revision.createURL(BundleImpl.java:2460)
    at org.eclipse.concierge.BundleImpl$JarBundleRevision.findFile(BundleImpl.java:3633)
    at org.eclipse.concierge.BundleImpl$JarBundleRevision.lookupFile(BundleImpl.java:3587)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findOwnResources(BundleImpl.java:3220)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource1(BundleImpl.java:2747)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource0(BundleImpl.java:2685)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.findResource(BundleImpl.java:2541)
    at org.eclipse.concierge.BundleImpl$Revision$BundleClassLoader.getResource(BundleImpl.java:2517)
    at java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:1307)
    at java.lang.Class.getResourceAsStream(Class.java:2223)
    at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:323)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at java.sql.DriverManager.isDriverAllowed(DriverManager.java:556)
    at java.sql.DriverManager.getConnection(DriverManager.java:661)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at nz.co.spark.cg.shared.sql.SQLUtils.getDBConnection(SQLUtils.java:19)
    at nz.co.spark.cg.shared.sql.SQLUtils.createLocalDB(SQLUtils.java:29)
    at nz.co.spark.cg.extractor.task.ChatExtractorJob.<init>(ChatExtractorJob.java:61)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:56)
    at org.quartz.simpl.PropertySettingJobFactory.newJob(PropertySettingJobFactory.java:69)
    at org.quartz.core.JobRunShell.initialize(JobRunShell.java:127)
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:375)

这发生在 oracle jdbc 驱动程序中,在 SQLStateMapping 类中,classr 正在尝试使用 SQLStateMapping.class.getResourceAsStream("error..xml"); 获取资源文件;

发生这种情况是因为在 OSGi 包中它更改了在其上插入“包”字的 URL,并且资源永远不会正确返回并抛出 java.net.MalformedURLException。有谁知道如何解决这个问题?

【问题讨论】:

    标签: oracle osgi-bundle ojdbc


    【解决方案1】:

    如果您想在 OSGi 中使用 JDBC,我建议您使用 (PAX-JDBC)。它使所有必需的胶水从 JDBC 驱动程序中注册 DataSourceFactory,如果您使用的是 ConfigAdmin 服务,您也可以注册 DataSource-s。当我使用能够处理 JDBC 连接或 DataSource 的库时,我从 OSGi 服务获取实例并使用它。它的好处是您也可以使用连接池,PAX-JDBC 开箱即用地支持它。如果文档不清楚,我可以用一些例子扩展这个答案,但首先有一个很好的tutorial。它基于 karaf,但它可以适应任何标准 OSGi 实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2011-06-23
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多