Почему сбой тестового соединения в Wildfly 20 с использованием драйвера SQL Anywhere sajdbc4?

#jdbc #database-connection #wildfly #driver #sybase

#jdbc #подключение к базе данных #wildfly #драйвер #sybase

Вопрос:

Ранее у меня был запущен Wildfly 10, и я только что обновился до Wildfly 20 (под Ubuntu 20). Моя конфигурация из Wildfly 10 больше не работает, когда дело доходит до работы драйвера Sybase SQL Anywhere 17 sajdbc4. Когда я «Тестирую соединение», происходит сбой. Я использую ту же конфигурацию и тестирую на точно таком же сервере базы данных (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 «runtime-name=»sajdbc4.jar «> содержимое sha1=»b690ff7a8ba1a3c2e8dd5079138b7970d969c2b9″/> / развертывание>

(Мне пришлось убрать начальные угловые скобки, чтобы отобразить предыдущие строки — даже если они помечены как код!) Затем я должен был убедиться, что java.library.path и classpath содержат путь к sajdbc4.jar и его файлы поддержки, чтобы Wildfly мог их найти. Для этого я добавил «ВЗЛОМ» к следующему в 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, извлекает данные из таблицы и отображает строки. Обратите внимание, что он использует точно такие же java.library.path и classpath, которые я установил в standalone.conf:

 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 (отсюда и два URL-адреса). В Wildfly 20 я вижу, что теперь на странице определения источника данных консоли появилось новое поле «Разделитель URL-адресов HA». Я попытался установить это значение в запятую, и это просто изменило ошибку тестового соединения на «Невозможно создать соединение с 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)
  

Как мне заставить «Тестовое соединение» работать?

Заранее благодарю вас.

Ответ №1:

Проблема оказалась связана с тем фактом, что я запускал Wildfly как службу, и, по-видимому, мои усилия выше, чтобы установить java.library.path, терпят неудачу. Я знаю причину ошибки, но я не знаю, как задать путь при запуске в качестве службы.