创建与 WildFly 10 和 Jaybird 3.0 的连接失败

Posted

技术标签:

【中文标题】创建与 WildFly 10 和 Jaybird 3.0 的连接失败【英文标题】:Creating a connection with WildFly 10 and Jaybird 3.0 fails 【发布时间】:2017-01-03 21:35:38 【问题描述】:

我已将 Wildfly 10 中的 Jaybird 依赖项从 Jaybird 2.2.11 升级到 Jaybird 3.0.0-alpha-1。当我尝试创建连接时,现在出现以下异常。

启动后的第一次连接(在管理控制台中测试时):

2016-08-27 10:50:45,354 WARN  [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (External Management Request Threads -- 2) IJ000604: Throwable while attempting to get a new connection: null: javax.resource.ResourceException: IJ031084: Unable to create connection
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createLocalManagedConnection(LocalManagedConnectionFactory.java:345)
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:352)
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:287)
    at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreConcurrentLinkedDequeManagedConnectionPool.createConnectionEventListener(SemaphoreConcurrentLinkedDequeManagedConnectionPool.java:1320)
    at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreConcurrentLinkedDequeManagedConnectionPool.getConnection(SemaphoreConcurrentLinkedDequeManagedConnectionPool.java:496)
    at org.jboss.jca.core.connectionmanager.pool.AbstractPool.internalTestConnection(AbstractPool.java:1052)
    at org.jboss.jca.core.connectionmanager.pool.strategy.OnePool.testConnection(OnePool.java:93)
    at org.jboss.as.connector.subsystems.common.pool.PoolOperations$TestConnectionInPool.invokeCommandOn(PoolOperations.java:234)
    at org.jboss.as.connector.subsystems.common.pool.PoolOperations$1.execute(PoolOperations.java:90)
    at org.jboss.as.controller.AbstractOperationContext.executeStep(AbstractOperationContext.java:890)
    at org.jboss.as.controller.AbstractOperationContext.processStages(AbstractOperationContext.java:659)
    at org.jboss.as.controller.AbstractOperationContext.executeOperation(AbstractOperationContext.java:370)
    at org.jboss.as.controller.OperationContextImpl.executeOperation(OperationContextImpl.java:1329)
    at org.jboss.as.controller.ModelControllerImpl.internalExecute(ModelControllerImpl.java:400)
    at org.jboss.as.controller.ModelControllerImpl.execute(ModelControllerImpl.java:222)
    at org.jboss.as.domain.http.server.DomainApiHandler.handleRequest(DomainApiHandler.java:219)
    at io.undertow.server.handlers.encoding.EncodingHandler.handleRequest(EncodingHandler.java:72)
    at org.jboss.as.domain.http.server.security.SubjectDoAsHandler$1.run(SubjectDoAsHandler.java:72)
    at org.jboss.as.domain.http.server.security.SubjectDoAsHandler$1.run(SubjectDoAsHandler.java:68)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.jboss.as.controller.AccessAuditContext.doAs(AccessAuditContext.java:149)
    at org.jboss.as.domain.http.server.security.SubjectDoAsHandler.handleRequest(SubjectDoAsHandler.java:68)
    at org.jboss.as.domain.http.server.security.SubjectDoAsHandler.handleRequest(SubjectDoAsHandler.java:63)
    at io.undertow.server.handlers.BlockingHandler.handleRequest(BlockingHandler.java:56)
    at org.jboss.as.domain.http.server.DomainApiCheckHandler.handleRequest(DomainApiCheckHandler.java:95)
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:805)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: java.util.ServiceConfigurationError: org.firebirdsql.encodings.EncodingSet: Provider org.firebirdsql.encodings.DefaultEncodingSet could not be instantiated
    at java.util.ServiceLoader.fail(ServiceLoader.java:232)
    at java.util.ServiceLoader.access$100(ServiceLoader.java:185)
    at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
    at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
    at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
    at org.firebirdsql.encodings.EncodingFactory.loadEncodingSets(EncodingFactory.java:318)
    at org.firebirdsql.encodings.EncodingFactory.createInstance(EncodingFactory.java:474)
    at org.firebirdsql.encodings.EncodingFactory.access$000(EncodingFactory.java:36)
    at org.firebirdsql.encodings.EncodingFactory$DefaultEncodingFactory.<clinit>(EncodingFactory.java:59)
    at org.firebirdsql.encodings.EncodingFactory.getPlatformDefault(EncodingFactory.java:428)
    at org.firebirdsql.jdbc.FBDriverPropertyManager.handleEncodings(FBDriverPropertyManager.java:241)
    at org.firebirdsql.jdbc.FBDriverPropertyManager.normalize(FBDriverPropertyManager.java:208)
    at org.firebirdsql.jdbc.FBDriver.connect(FBDriver.java:116)
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createLocalManagedConnection(LocalManagedConnectionFactory.java:321)
    ... 31 more
Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
    at java.lang.Class.getConstructor0(Class.java:3075)
    at java.lang.Class.newInstance(Class.java:412)
    at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
    ... 42 more
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException from [Module "org.firebirdsql:main" from local module loader @1c2c22f3 (finder: local module finder @18e8568 (roots: D:\DevSoft\wildfly-10.1.0.Final\modules,D:\DevSoft\wildfly-10.1.0.Final\modules\system\layers\base))]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93)
    ... 47 more

随后尝试测试连接:

2016-08-27 10:50:52,349 WARN  [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (External Management Request Threads -- 4) IJ000604: Throwable while attempting to get a new connection: null: javax.resource.ResourceException: IJ031084: Unable to create connection
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createLocalManagedConnection(LocalManagedConnectionFactory.java:345)
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:352)
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:287)
    at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreConcurrentLinkedDequeManagedConnectionPool.createConnectionEventListener(SemaphoreConcurrentLinkedDequeManagedConnectionPool.java:1320)
    at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreConcurrentLinkedDequeManagedConnectionPool.getConnection(SemaphoreConcurrentLinkedDequeManagedConnectionPool.java:496)
    at org.jboss.jca.core.connectionmanager.pool.AbstractPool.internalTestConnection(AbstractPool.java:1052)
    at org.jboss.jca.core.connectionmanager.pool.strategy.OnePool.testConnection(OnePool.java:93)
    at org.jboss.as.connector.subsystems.common.pool.PoolOperations$TestConnectionInPool.invokeCommandOn(PoolOperations.java:234)
    at org.jboss.as.connector.subsystems.common.pool.PoolOperations$1.execute(PoolOperations.java:90)
    at org.jboss.as.controller.AbstractOperationContext.executeStep(AbstractOperationContext.java:890)
    at org.jboss.as.controller.AbstractOperationContext.processStages(AbstractOperationContext.java:659)
    at org.jboss.as.controller.AbstractOperationContext.executeOperation(AbstractOperationContext.java:370)
    at org.jboss.as.controller.OperationContextImpl.executeOperation(OperationContextImpl.java:1329)
    at org.jboss.as.controller.ModelControllerImpl.internalExecute(ModelControllerImpl.java:400)
    at org.jboss.as.controller.ModelControllerImpl.execute(ModelControllerImpl.java:222)
    at org.jboss.as.domain.http.server.DomainApiHandler.handleRequest(DomainApiHandler.java:219)
    at io.undertow.server.handlers.encoding.EncodingHandler.handleRequest(EncodingHandler.java:72)
    at org.jboss.as.domain.http.server.security.SubjectDoAsHandler$1.run(SubjectDoAsHandler.java:72)
    at org.jboss.as.domain.http.server.security.SubjectDoAsHandler$1.run(SubjectDoAsHandler.java:68)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.jboss.as.controller.AccessAuditContext.doAs(AccessAuditContext.java:149)
    at org.jboss.as.domain.http.server.security.SubjectDoAsHandler.handleRequest(SubjectDoAsHandler.java:68)
    at org.jboss.as.domain.http.server.security.SubjectDoAsHandler.handleRequest(SubjectDoAsHandler.java:63)
    at io.undertow.server.handlers.BlockingHandler.handleRequest(BlockingHandler.java:56)
    at org.jboss.as.domain.http.server.DomainApiCheckHandler.handleRequest(DomainApiCheckHandler.java:95)
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:805)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.firebirdsql.encodings.EncodingFactory$DefaultEncodingFactory
    at org.firebirdsql.encodings.EncodingFactory.getPlatformDefault(EncodingFactory.java:428)
    at org.firebirdsql.jdbc.FBDriverPropertyManager.handleEncodings(FBDriverPropertyManager.java:241)
    at org.firebirdsql.jdbc.FBDriverPropertyManager.normalize(FBDriverPropertyManager.java:208)
    at org.firebirdsql.jdbc.FBDriver.connect(FBDriver.java:116)
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createLocalManagedConnection(LocalManagedConnectionFactory.java:321)
    ... 31 more

我将以下 module.xml 用于 Jaybird 驱动程序:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="org.firebirdsql">
  <resources>
    <resource-root path="jaybird-3.0.0-alpha-1.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
    <module name="javax.resource.api"/>
  </dependencies>
</module>

这是什么原因造成的,我该如何解决?

注意:这个问题/答案来自错误报告JDBC-449

【问题讨论】:

【参考方案1】:

在提问时,Jaybird 3 的测试版本还依赖于 javax.xml.bind 中的类,如 java.lang.ClassNotFoundException: javax.xml.bind.JAXBException 所示。此异常会导致编码定义的加载失败,进而导致org.firebirdsql.encodings.EncodingFactory$DefaultEncodingFactory 的加载失败。结果,无法建立连接。

后续尝试的异常是因为无法加载EncodingFactory$DefaultEncodingFactory

注意:对 javax.xml.bind 的依赖已在 Jaybird 3.0.0 最终版本中删除,因此对于 Jaybird 的最终版本不需要以下解决方法3 及更高版本(请参阅下面有关 Jaybird 3.0.4 及更高版本的说明)。

解决方案是将 javax.xml.bind.api 的依赖添加到 Jaybird 模块的依赖中:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="org.firebirdsql">
  <resources>
    <resource-root path="jaybird-3.0.0-alpha-1.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
    <module name="javax.resource.api"/>
    <module name="javax.xml.bind.api"/> <!-- Add this -->
  </dependencies>
</module>

Jaybird 3.0.4 及更高版本的注意事项

Jaybird 3.0.4 for Java 7 只重新引入了对 JAXB 的依赖。如果可能,切换到 Java 8 版本的 Jaybird,否则应用此解决方案。

【讨论】:

以上是关于创建与 WildFly 10 和 Jaybird 3.0 的连接失败的主要内容,如果未能解决你的问题,请参考以下文章

我无法让会话复制与 Wildfly 10 一起使用

Wildfly 10:尝试实现 Java 并发实用程序时出错

将 glassfish JEE8 weapp 迁移到 Wildfly10 (Jboss) - eclipseLink 不创建数据库表

Wildfly 10 Sys-log-handler 打印与 Byte_order_mark <feff>

在 Wildfly 10 上运行 EJB 2.1

Wildfly 数据源与 DefaultDS 冲突