在 JBoss / Wildfly 上允许部署的应用程序使用不同的 jdbc 驱动程序的正确方法是什么?

Whats the correct way to allow different jdbc drivers for deployed applications on JBoss / Wildfly?

我的设置如下:

<?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>

第一个选项:

我可以把我的 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-驱动程序实现灵活目标的正确方法是什么?


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

我建议您将所有数据库驱动程序单独安装为模块。个别模块将帮助您在未来轻松跟踪和升级驱动程序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.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>

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

Keycloak 有一个设计精良的容器。您可以从中获得灵感进行部署。看看 Dockerfile installs database driver modules and later how to activate those modules using jboss_cli.

是如何实现的

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