db2wildfly-swarmthorntail

Configure a db2 datasource with Thorntail / Wildfly Swarm


Has anyone managed to configure a db2 datasource with Thorntail / Wildfly Swarm?

As far as I understand: As soon as I pull in the datasources fraction, the db2 driver should be autodetected according to documentation (https://docs.thorntail.io/2.3.0.Final/#auto-detecting-jdbc-drivers_thorntail). So the only thing I should have to do is reference "ibmdb2" as the driver-name in my datasource, right?

pom.xml (using Thorntail 2.3.0.Final)

    <dependency>
        <groupId>io.thorntail</groupId>
        <artifactId>datasources</artifactId>
    </dependency>

    <dependency>
        <groupId>com.ibm.db2</groupId>
        <artifactId>db2jcc_license_cu</artifactId>
        <version>10.1</version>
    </dependency>

    <dependency>
        <groupId>com.ibm.db2</groupId>
        <artifactId>db2jcc4</artifactId>
        <version>4.22.29</version>
    </dependency>

project-defauls.yml

swarm:
  context:
    path: /

  datasources:
    data-sources:
      MYDS:
        driver-name: ibmdb2
        connection-url: jdbc:db2://host:port/schema
        user-name: user
        password: password

Currently I get the following error on startup:

2019-05-02 09:07:52,747 INFO  [org.wildfly.swarm.datasources] (main) THORN1003: Auto-detected JDBC driver for ibmdb2
2019-05-02 09:07:57,660 ERROR [org.jboss.as.controller.management-operation] (ServerService Thread Pool -- 16) WFLYCTL0013: Operation ("add") failed - address: ([
    ("subsystem" => "datasources"),
    ("jdbc-driver" => "ibmdb2")
]) - failure description: "WFLYJCA0114: Failed to load datasource class: com.ibm.db2.jdbc.DB2XADataSource"

Solution

  • You found a bug in the JDBC driver autodetection code. The driver was (probably) autodetected, but it was wrongly configured. Specifically, this line of code sets the XA datasource class name to com.ibm.db2.jdbc.DB2XADataSource, which doesn't exist. (That's actually what your error message says, but I also confirmed it by looking into the JDBC driver JAR.) The correct class name is com.ibm.db2.jcc.DB2XADataSource. I filed THORN-2398 and submitted a PR with a fix.

    I'm not sure if there's a simple workaround, because JDBC driver autodetection is performed after all configuration is applied. Perhaps the following hack might work. Define a new JDBC driver in project-defaults.yml like this:

    thorntail:
      datasources:
        jdbc-drivers:
          mydb2:
            driver-module-name: com.ibm.db2jcc
            driver-xa-datasource-class-name: com.ibm.db2.jcc.DB2XADataSource
    

    But keep everything else intact. That means there will be 2 JDBC drivers for DB2, one autodetected (which will create the com.ibm.db2jcc module), and the second one you create that will piggyback on the infrastructure created by the first. If that works, just change driver-name: ibmdb2 in your data source to driver-name: mydb2.

    If this doesn't work, you'll have to move off of JDBC driver autodetection for now, until the issue is fixed.