【问题标题】:Whats the correct way to allow different jdbc drivers for deployed applications on JBoss / Wildfly?在 JBoss / Wildfly 上为部署的应用程序允许不同的 jdbc 驱动程序的正确方法是什么?
【发布时间】:2019-07-15 15:05:09
【问题描述】:

我的设置如下:

  • 我有一个应用程序,我部署在/standalone/deployments
  • 我在/standalone/deployments 中部署的jboss-deployment-structure.xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            [...]
            <module name="org.postgresql"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>
<?xml version="1.0" encoding="UTF-8"?>
<module name="org.postgresql" xmlns="urn:jboss:module:1.5">
    <resources>
        <resource-root path="postgresql-42.2.5.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>
  • 我的要求是,允许不同类型的 jdbc-drivers,例如postgres、oracle、mssql。

第一个选项:

我可以将我的jboss-deployment-structure.xml 更改为

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            [...]
            <module name="org.postgresql" optional="TRUE"/>
            <module name="com.oracle.ojdbc6" optional="TRUE"/>
            [...]
        </dependencies>
    </deployment>
</jboss-deployment-structure>

(添加了可选参数)

然后我必须明确允许所有驱动程序。似乎不是最好的方法。

这个想法来自标准documentation。


第二个选项:

我将我的模块路径更改为driver/jdbc/main(而不是org/postgres/main),并将module.xml 更改为

<module name="driver.jdbc" xmlns="urn:jboss:module:1.5">
[...]
</module>

(模块名称已更改)

并使用我的 jboss-deployment-structure.xml 中的模块引用,例如

<jboss-deployment-structure>
    [...]
    <module name="driver.jdbc"/>
    [...]
</jboss-deployment-structure>

现在我强迫我的客户按照我的建议命名驱动程序模块。他们不能像每个标准文档中提到的那样命名模块。

这个想法来自这个question。


我在 keycloak 安装的上下文中执行此操作,并使用自行实现的用户联合来访问单独的(旧版)用户数据库。因此,如上所述,删除jboss-deployment-structure.xml 不是选项。

使用 jdbc-driver 实现灵活目标的正确方法是什么?


编辑:提到,删除jboss-deployment-structure.xml 不起作用。

【问题讨论】:

    标签: jdbc jboss wildfly keycloak


    【解决方案1】:

    我建议您将所有数据库驱动程序单独安装为模块。单独的模块将帮助您在未来轻松跟踪和升级驱动程序 jar。

    只要您的应用程序没有任何类加载问题,您就无需在jboss-deployment-structure.xml 文件中提及这些驱动程序。它们是静态模块,将在服务器启动时加载。

    此外,安装驱动模块后,您必须在standalone.xml 文件中添加条目。例如,如果我已经安装了 Oracle 驱动程序,那么

    <driver name="oracle" module="com.oracle">
     <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    </driver>
    

    在标签内。 在标签内添加数据源定义(ExampleDS 旁边):

    <datasource jndi-name="java:/[NAME]" pool-name="OracleDS" enabled="true">
     <connection-url>jdbc:oracle:thin:@[HOST_NAME]:1521:[SID]</connection-url>
      <driver>oracle[has to match the driver name]</driver>
      <pool>
       <min-pool-size>1</min-pool-size>
       <max-pool-size>5</max-pool-size>
       <prefill>true</prefill>
      </pool>
      <security>
       <user-name>[USER]</user-name>
       <password>[PWD]</password>
      </security>
    </datasource>
    

    【讨论】:

    • 我不想在一个系统上安装所有驱动程序,而是在每个客户系统上安装不同的驱动程序。如果我没有在 jboss-deployment-structure 中提及驱动程序,我会收到“找不到合适的驱动程序”的错误。
    • 或者您的方法是完全删除 jboss-deployment-structure 吗?有standalone.xml的部分理解并完成。
    • 我想说的是,如果您没有任何类加载问题,请不要使用jboss-deployment-structure.xml。 Wildfly 将从standalone.xml 文件中加载配置,您在其中提到了driver 标签下的模块详细信息。
    • 完全删除jboss-deployment-structure.xml 是行不通的。我在驱动程序旁边使用了更多的依赖项,然后找不到。错误:java.lang.NoClassDefFoundError: [...] org/keycloak/protocol/oidc/mappers/OIDCAccessTokenMapper. 仅删除驱动程序后,我还得到:java.sql.SQLException: No suitable driver found for jdbc:postgresql://myUrl。所以,对我来说,我似乎无法删除 jboss-deployment-structure.xml 或文件中的驱动程序。
    【解决方案2】:

    至少我对jboss-deployment-structure.xml 采用了上述两种方法的混合解决方案,如下所示

    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-deployment-structure>
        <deployment>
            <dependencies>
                <module name="org.postgresql" optional="TRUE"/>
                <module name="com.oracle.ojdbc6" optional="TRUE"/>
                [...]
                <module name="driver.jdbc" optional="TRUE"/>
            </dependencies>
        </deployment>
    </jboss-deployment-structure>
    

    如果需要驱动程序,我将所有相关的数据库驱动程序列为可选模块,并列出了另一个具有灵活命名的驱动程序,这在上面的列表中没有提及。

    【讨论】:

      【解决方案3】:

      Keycloak 有一个设计非常好的容器。您可以从中获得灵感来进行部署。看看Dockerfile installs database driver modules 和后来的how to activate those modules using jboss_cli 是如何实现的。

      当然,如果可以的话,也许你可以使用容器来代替。只需确保为您的驱动程序包含 module.xml 并在启动时通过提供您自己的入口点来激活它。

      【讨论】:

      • 我很确定,我的前同事使用 docker 从上面解决了这个问题(或者完全不同)。 :) 但很好的提示。
      猜你喜欢
      • 1970-01-01
      • 2012-04-21
      • 2021-02-07
      • 2019-08-06
      • 2021-11-26
      • 2014-09-01
      • 2020-12-01
      • 2016-11-02
      • 1970-01-01
      相关资源
      最近更新 更多