【问题标题】:Using apache commons BasicDataSource in wildfly 8在wildfly 8中使用apache commons BasicDataSource
【发布时间】:2015-09-23 11:03:01
【问题描述】:

我想使用BasicDataSource 的apache commons 库来创建连接池。使用 apache tomcat 8 服务器可以正常工作,但是当我尝试使其与 wildfly 8 一起使用时,出现以下异常:

java.lang.ClassCastException: org.jboss.jca.adapters.jdbc.WrapperDataSource 无法转换为 org.apache.commons.dbcp2.BasicDataSource

我获取数据源的方法是在InitialContext 对象中执行lookup。此函数根据使用的服务器类型返回一个数据源类。在 tomcat 中,它返回一个 BasicDataSource,但在 WildFly 中,它返回一个 WrapperDataSource,显然不能转换为 BasicDataSource。我尝试从 wildfly 管理中更改DataSource class,但问题仍然存在,我不知所措。是否无法更改lookup 返回的对象类型?有没有办法将WrapperDataSource 变成BasicDataSource??

【问题讨论】:

    标签: java apache tomcat datasource wildfly-8


    【解决方案1】:

    我会先说我从未使用过它,我不确定为什么要使用与 Wildfly 不同的连接池和数据源提供程序,但 Wildfly 确实提供了一个 您可以配置为使用 BasicDataSource 的属性。

    我快速搜索了一下,发现了这个:https://developer.jboss.org/thread/203514?tstart=0

    对于 JBoss AS 7.1.1,可以想象这也适用于 Wildfly。

    <datasource jta="false" jndi-name="java:jboss/datasources/MyDS" pool-name="MyDataSource" enabled="true" use-ccm="false">
        <connection-url>jdbc:mysql://localhost/xxx</connection-url>
        <driver-class>com.mysql.jdbc.Driver</driver-class>
        <datasource-class>org.apache.commons.dbcp.BasicDataSource</datasource-class>
        <driver>custom.mysql</driver>
        <security>
            <user-name>xxx</user-name>
            <password>xxx</password>
        </security>
    </datasource>
    

    也就是说,我尝试按照上面指定的方式配置数据源(驱动程序模块,在这种情况下为 mysql,必须知道这些 apache commons JAR 资源,我的第一次尝试导致 ClassDefNotFound),然后引用它们像这样使用 WildFly 8.1.0 final 进行快速测试:

    InitialContext initCtx = null;
    DataSource ds = null;
    initCtx = new InitialContext();
    ds = (DataSource) initCtx.lookup("java:jboss/datasources/MyDS"); 
    Connection conn = ds.getConnection();
    

    这导致了一个“ds”对象,它确实是一个 BasicDataSource(没有类转换异常),但在下一行我得到了以下异常:

    Caused by: java.lang.UnsupportedOperationException: Not supported by BasicDataSource
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1062)
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createLocalManagedConnection(LocalManagedConnectionFactory.java:308)
    ... 45 more
    

    所以也许这可以帮助您更进一步。我会检查 Wildfly 文档,了解为不同的 jdbc 驱动程序配置模块以及如何配置数据源,也许您根本不需要使用公共库: https://docs.jboss.org/author/display/WFLY8/DataSource+configuration https://sheemoul.wordpress.com/2014/06/17/configure-mysql-datasource-in-wildfly-8-0/

    【讨论】:

    • 我知道 &lt;datasource-class&gt; 属性并尝试对其进行配置,但据我了解,它需要是与使用的 jdbc driver 相同的 .jar 中的一个类。而且由于我们将sqljdbc4.jar 用于sql server 数据库,因此我不能使用apache commons 库中的数据源类。它会抛出一个异常,即在sqljdbc4.jar 中找不到BasicDataSource。我不知道 mysql 驱动程序如何知道 apache 库,但 sqljdbc 肯定不知道。我将进一步检查 wildfly 数据源提供程序的池化,但我的第一次尝试失败了。
    • 我不认为它需要在同一个 jar 中,但您可能需要将它添加到您的模块定义中。这与我在 mysql 测试中遇到的问题相同(它也不包含在 mysql jar 中):查看模块描述符,特别是资源根:docs.jboss.org/author/display/MODULES/Module+descriptors
    • 我在资源标签中添加了.jar,但它不起作用。我还尝试将包链接作为模块添加到依赖项中,它仍然会引发异常。 &lt;module xmlns="urn:jboss:module:1.1" name="com.microsoft.sqlserver"&gt; &lt;resources&gt; &lt;resource-root path="sqljdbc4.jar"/&gt; &lt;resource-root path="commons-dbcp2-2.1.jar"/&gt; &lt;/resources&gt; &lt;dependencies&gt; &lt;module name="javax.api"/&gt; &lt;module name="javax.transaction.api"/&gt; &lt;module name="org.apache.commons.dbcp"/&gt; &lt;/dependencies&gt; &lt;/module&gt;
    猜你喜欢
    • 2014-07-02
    • 2019-09-02
    • 2017-04-14
    • 2019-05-19
    • 2011-03-26
    • 2014-08-06
    • 1970-01-01
    • 2014-12-13
    • 2018-01-02
    相关资源
    最近更新 更多