#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
Как я это настроил:
-
Я использовал консоль для развертывания 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, терпят неудачу. Я знаю причину ошибки, но я не знаю, как задать путь при запуске в качестве службы.