我想知道是否有人知道wildfly 10中存在以下问题。
在尝试为HSQL设置数据源时,我遇到了一个问题,对于非xa数据源驱动程序,您可能希望配置元素connection-url
具有任何用途。特别是,当您尝试连接到H2或oracle时,此配置元素将被使用。
但是,在测试以下配置时,我系统地在HSQL getConnection上遇到空指针异常。
hsql modulue作为jboss模块添加:
<module xmlns="urn:jboss:module:1.3" name="org.hsql">
<properties>
</properties>
<resources>
<resource-root path="hsqldb-2.3.2.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
数据源的原始配置,不起作用的配置如下:
<datasource jta="false" jndi-name="java:/jdbc/HSQL_NON_JTA_DS" pool-name="HSQL_NON_JTA_DS" enabled="true" use-ccm="true">
<connection-url>jdbc:hsqldb:hsql://localhost:9001/DATABSE</connection-url>
<datasource-class>org.hsqldb.jdbc.JDBCDataSource</datasource-class>
<driver>hsql</driver>
<security>
<user-name>USER</user-name>
<password>USER</password>
</security>
</datasource>
<driver name="hsql" module="org.hsql">
<datasource-class>org.hsqldb.jdbc.JDBCDataSource</datasource-class>
</driver>
使用以下堆栈跟踪:
2017-03-01 18:08:47,083 WARN [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (thread: management task-6) 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:343)
at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:350)
at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:285)
at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreConcurrentLinkedDequeManagedConnectionPool.createConnectionEventListener(SemaphoreConcurrentLinkedDequeManagedConnectionPool.java:1319)
at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreConcurrentLinkedDequeManagedConnectionPool.getConnection(SemaphoreConcurrentLinkedDequeManagedConnectionPool.java:496)
at org.jboss.jca.core.connectionmanager.pool.AbstractPool.internalTestConnection(AbstractPool.java:1061)
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:1344)
at org.jboss.as.controller.ModelControllerImpl.internalExecute(ModelControllerImpl.java:392)
at org.jboss.as.controller.ModelControllerImpl.execute(ModelControllerImpl.java:217)
at org.jboss.as.domain.http.server.DomainApiHandler.handleRequest(DomainApiHandler.java:212)
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:92)
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.security.handlers.AuthenticationCallHandler.handleRequest(AuthenticationCallHandler.java:52)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:793)
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)
Caused by: java.lang.NullPointerException
at org.hsqldb.jdbc.JDBCDataSource.getConnection(Unknown Source)
at org.hsqldb.jdbc.JDBCDataSource.getConnection(Unknown Source)
at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createLocalManagedConnection(LocalManagedConnectionFactory.java:312)
... 31 more
这个空指针异常发生,很简单因为。 在HSQL的JDBCDataSource.java中,以下方法获取空URL。 这意味着,JBOSS没有在connection-url上获取URL并在驱动程序上配置。
private Connection getConnection(String url,
Properties props) throws SQLException {
if (!url.startsWith("jdbc:hsqldb:")) {
url = "jdbc:hsqldb:" + url;
}
return JDBCDriver.getConnection(url, props);
}
注意:如果要调试HSQL,则需要使用HSQL在内部发布的-debug.jar文件。 无论如何......
在发现IRON JCAMAR提供数据源的子系统之后,可以搜索文档以获取额外的配置属性,以解决本来不应该出现问题的问题。
以下是有关数据源支持的元素的文档。 http://www.ironjacamar.org/doc/userguide/1.1/en-US/html_single/index.html#deployingds_descriptor
Ultiamtely,使连接工作有必要用以下元素来丰富它。
<connection-property name="url">jdbc:hsqldb:hsql://localhost:9001/DATABSE</connection-property>
是否有必要添加其他元素?它应该是多余的和不必要的。支持客户数据源属性是一件好事。
在这种情况下,是HSQL的问题还是JBOSS的问题。 在eery其他应用服务器中,指定连接URL始终工作正常。 对我而言,这似乎是Wildfly的特殊行为。
这是一个非常严重的问题,因为您对数据源的平均文档只是清楚地表明connection-url是您需要配置的元素。在这种情况下,它确实不是。
非常感谢您对此的回复。
答案 0 :(得分:0)
看起来像配置问题。将模块名称更新为datasource和module.xml文件中的org.hsqldb
,以遵循标准模块命名约定。将模块目录下的目录名从 hsql 更新为 hsqldb 。全取决于你。您也可以使用自定义模块命名约定。
某些驱动程序没有在其数据源类中实现getURL()
方法。因此,我们必须为它们指定不同的数据源配置。
与Postgres一样,没有getURL方法。因此,我们将在stanalone.xml / domain.xml文件中指定这样的属性。
<xa-datasource-property name="ServerName">DatabaseHostName</xa-datasource-property>
<xa-datasource-property name="PortNumber">DatabasePortName</xa-datasource-property>
<xa-datasource-property name="DatabaseName">DatabaseName</xa-datasource-property>
<xa-datasource-class>com.edb.xa.PGXADataSource</xa-datasource-class>
<driver>postgresql</driver>
<security>
<user-name>database.username</user-name>
<password>database.password</password>
</security>
如果Oracle实现了getURL
方法,则下面给出的配置可以正常工作。
<xa-datasource-property name="URL">jdbc:oracle:thin:@database.host:database.port:database.name</xa-datasource-property>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<driver>oracle</driver>
我不确定getURL
API的HSQL驱动程序实现。您可以尝试指定我为Postgres提到的属性,并检查它是否适用于您的用例。