Wildfly 10 - HSQL Datascource - 与数据库

时间:2017-03-01 18:45:38

标签: datasource wildfly wildfly-10

我想知道是否有人知道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是您需要配置的元素。在这种情况下,它确实不是。

非常感谢您对此的回复。

1 个答案:

答案 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提到的属性,并检查它是否适用于您的用例。