为什么使用 SQL Anywhere sajdbc4 驱动程序在 Wildfly 20 中测试连接失败?

Why does Test Connection fail in Wildfly 20 Using SQL Anywhere sajdbc4 driver?

我之前有 Wildfly 10 运行,刚刚升级到 Wildfly 20(低于 Ubuntu 20)。在让 Sybase SQL Anywhere 17 sajdbc4 驱动程序正常工作时,我在 Wildfly 10 中的配置不再有效。当我“测试连接”时,它失败了。我正在使用相同的配置并针对完全相同的(SQL Anywhere High Availability)数据库服务器进行测试。

以下数据源上的“测试连接”触发“无效的 ODBC 句柄”错误:

<datasource jndi-name="java:jboss/datasources/TestDB" pool-name="TestDB" spy="true" tracking="true" enlistment-trace="true">
    <connection-url>jdbc:sqlanywhere:Host=192.168.1.45:19000,192.168.1.45:19001;ServerName=TestDB</connection-url>
    <driver>sajdbc4.jar</driver>
             <security>
                <user-name>...</user-name>
                 <password>...</password>
             </security>
</datasource>

连接无效

原因:java.sql.SQLException:无效的 ODBC 句柄

at deployment.sajdbc4.jar//sap.jdbc4.sqlanywhere.IDriver.makeODBCConnection(Native Method)
at deployment.sajdbc4.jar//sap.jdbc4.sqlanywhere.IDriver.connect(IDriver.java:809)
at org.jboss.ironjacamar.jdbcadapters@1.4.22.Final//org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createLocalManagedConnection(LocalManagedConnectionFactory.java:321)
... 35 more

我是如何设置的:

  1. 我使用控制台部署了 sajdbc4.jar,这似乎工作正常。我没有看到任何错误,并且 sajdbc4 在控制台中显示为已部署,它还在子系统中显示为 JDBC 驱动程序。这是使用控制台后在 standalone.xml 中创建的内容:

    部署名称="sajdbc4.jar" 运行时名称="sajdbc4.jar"> 内容 sha1="b690ff7a8ba1a3c2e8dd5079138b7970d969c2b9"/> /部署>

(我必须去掉前导尖括号才能显示前面的行 - 即使标记为代码!) 接下来,我必须确保 java.library.path 和类路径包含 sajdbc4.jar 及其支持文件的路径,以便 Wildfly 可以找到它们。为此,我将“HACK”添加到 standalone.conf 中的以下内容:

if [ "x$JAVA_OPTS" = "x" ]; then
   JAVA_OPTS="-Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true"
   JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true"
   # ADDED FOLLOWING HACK
   JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/opt/wildfly-20.0.1.Final/modules/system/layers/base/com/sybase/main -cp .:/opt/wildfly-20.0.1.Final/modules/system/layers/base/com/sybase/main/sajdbc4.jar"
   echo "Java Properties Next:"
   java -XshowSettings:properties -version
else
   echo "JAVA_OPTS already set in environment; overriding default settings with values: $JAVA_OPTS"
fi

最后,我添加了顶部显示的数据源块。启动 Wildfly TestDB 后,在数据源子系统中显示为数据源,但是当我测试连接时,我收到“无效的 ODBC 句柄”错误。

我确信驱动程序及其所有支持文件都在“工作”,因为我有一个非常简单的 Java 测试应用程序,它只连接到 TestDB,从 table 中获取并显示行。请注意,它使用与我在 standalone.conf:

中设置的完全相同的 java.library.path 和类路径
cd $HOME/Desktop
export LD_LIBRARY_PATH=/opt/wildfly-20.0.1.Final/modules/system/layers/base/com/sybase/main
export CLASSPATH=.:/opt/wildfly-20.0.1.Final/modules/system/layers/base/com/sybase/main/sajdbc4.jar
java sajdbc4DriverTest.java

请注意 server.log 没有显示任何错误,实际上显示的行如下:

[org.jboss.as.server.deployment] (MSC service thread 1-3) WFLYSRV0027: Starting deployment of "sajdbc4.jar" (runtime-name: "sajdbc4.jar")
...
[org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-4) WFLYJCA0005: Deploying non-JDBC-compliant driver class sap.jdbc4.sqlanywhere.IDriver (version 4.0)
[org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-3) WFLYJCA0018: Started Driver service with driver-name = sajdbc4.jar
[org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-3) WFLYJCA0001: Bound data source [java:jboss/datasources/TestDB]
...
[org.jboss.as.server] (Controller Boot Thread) WFLYSRV0010: Deployed "sajdbc4.jar" (runtime-name : "sajdbc4.jar")

请注意,我的连接字符串用于连接到 SQL Anywhere 高可用性系统(因此有两个 URLS)。在 Wildfly 20 中,我看到控制台的数据源定义页面中现在有一个新的“HA URL 分隔符”字段。我尝试将其设置为逗号,只是将测试连接错误更改为“无法从 URL 创建连接”:

2020-08-25 11:45:08,378 WARN  [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (External Management Request Threads -- 1) IJ000604: Throwable while attempting to get a new connection: null: javax.resource.ResourceException: IJ031085: Unable to create connection from URL: jdbc:sqlanywhere:Host=192.168.1.45:19000,192.168.1.45:19001;ServerName=TestDB
    at org.jboss.ironjacamar.jdbcadapters@1.4.22.Final//org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getHALocalManagedConnection(LocalManagedConnectionFactory.java:381)

如何让“测试连接”工作?

提前致谢。

问题原来与我使用 运行 Wildfly 即服务这一事实有关,显然我在上面设置 java.library.path 的努力失败了。我知道错误的原因,但我不知道如何在 运行 作为服务时设置路径。