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

41ik7eoe  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(101)

我的设置如下:

  • 我得到了一个应用程序,它部署在/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>
  • 完全删除jboss-deployment-structure.xml(因为如果没有类加载问题,就不能使用它)是行不通的。我在驱动程序旁边使用了更多的依赖项(keycloak),这样就找不到了。
  • 我的模块org/postgresql/main中的module.xml看起来是这样的(就像在https://www.keycloak.org/docs/4.8/server_installation/index.html#package-the-jdbc-driver中描述的那样)
<?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驱动程序,如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安装的上下文中这样做的,它使用一个自实现的用户联盟来访问一个单独的(遗留的)用户数据库。

实现我灵活使用jdbc-driver的目标的正确方法是什么?
**编辑:**提到,删除jboss-deployment-structure.xml不起作用。

l0oc07j2

l0oc07j21#

Keycloak有一个设计得非常好的容器。你可以从它那里获得部署的灵感。只要看看Dockerfile如何安装数据库驱动模块,以及稍后如何使用jboss_cli激活这些模块。
当然,如果可以的话,也可以使用容器来代替,只要确保包含驱动程序的module.xml,并在启动时通过提供自己的入口点来激活它。

68bkxrlz

68bkxrlz2#

我建议你应该把所有的数据库驱动程序作为模块单独安装。单独的模块将帮助你在将来很容易地跟踪和升级驱动程序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>
14ifxucb

14ifxucb3#

至少我使用了上面提到的两种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>

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

相关问题