Инструменты пользователя

Инструменты сайта


pm:jdbc

Процедура подключения сторонней базы по JDBC

Получение драйвера JDBC для БД

Например, для mariadb драйвер берётся с сайта https://mariadb.com/kb/en/about-mariadb-connector-j/

Cкачанный драйвер (mariadb-java-client) размещаем в месте, которое доступно cacheusr например

/lib/jvm/jre/mariadb-java-client-3.1.2.jar

данный jar содержит java-класс, который служит драйвером: org.mariadb.jdbc.Driver

Настройка шлюза

не нашёл, как это сделать из интерфейса /csp/sys/mgr/%25CSP.UI.Portal.JDBCGatewayServer.zen? поэтому пропатчил %Net.Remote.Service:CmdLineForJava, добавив

Set tClassPath = tClassPath_":/lib/jvm/jre/mariadb-java-client-3.1.2.jar"

после этого в интерфейсе при старте шлюза соответствующая команда отображается как

Executing O.S. command: java -Xrs -classpath /opt/cache/dev/java/lib/JDK18/cache-gateway-2.0.0.jar:/opt/cache/dev/java/lib/JDK18/cache-jdbc-2.0.0.jar:/lib/jvm/jre/mariadb-java-client-3.1.2.jar com.intersys.gateway.JavaGateway "62972" "jdbcSqlGateway.log" "" "" "" 2>&1 

если взять соответствующую команду, добавить в неё -verbose:class, то grep'ом можно убедиться, что класс подгружается

java -Xrs -verbose:class -classpath /opt/cache/dev/java/lib/JDK18/cache-gateway-2.0.0.jar:/opt/cache/dev/java/lib/JDK18/cache-jdbc-2.0.0.jar:/lib/jvm/jre/mariadb-java-client-3.1.2.jar com.intersys.gateway.JavaGateway "62972" "jdbcSqlGateway.log" "" "" "" | grep mariadb
	
[Loaded org.mariadb.jdbc.Driver from file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre/mariadb-java-client-3.1.2.jar]
[Loaded org.mariadb.jdbc.client.Client from file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre/mariadb-java-client-3.1.2.jar]

Возможно, то же самое можно сделать программно, открыв соответствующий экземпляр %Net.Remote.Java.JavaGateway, можно посмотреть.

при необходимости в шлюзе указывается файл журнала, например jdbcSqlGateway.log, тогда соединение будет логироваться в /opt/cache/mgr/jdbcSqlGateway.log

Настройка соединения

Портал Управления - Администрирование системы - Соединения - Соединения SQL-шлюза

/csp/sys/mgr/UtilSqlGateways.csp

  • Тип соединения: JDBC
  • Имя соединения: указываем какое-то название
  • Пользователь и пароль указываются из тех, которые имеют доступ к нужной БД
  • Имя драйвера: org.mariadb.jdbc.Driver
  • где
    • 10.160.1.106 - хост, на котором БД
    • 3306 - порт, на котором БД слушает входящие соединения (обычно 3306)
    • elgg_n - БД - обязательно к указанию, иначе при выполнении запросов будет ошибка, что не выбрана БД

При корректном указании параметров кнопка «Проверить соединение» выдаёт сообщение «Соединение удачно произведено.»

Выполнение запросов

Set QHandle=$$GetJConnection^%apiGTW("testmysql")

где testmysql - название соединения, определённого на предыдущем этапе

создаёт глобальную переменную %JDBCGateway, которая является экземпляром класса %Net.Remote.Java.JDBCGateway

и реализует собственно методы из JDBC API https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/

для подготовки обычного запроса (запрос может быть любым, поддерживаемым соответствующей БД, то есть не обязательно объявлять AS)

s QHandle	= %JDBCGateway.prepareStatement(QHandle,"select T1.id AS C1 from elgg_system_log AS T1;")
s QHandle	= %JDBCGateway.execQuery(QHandle)
s next		= %JDBCGateway.next(QHandle)
s id		= %JDBCGateway.getString(QHandle,1)

zw 

примеры использования можно поискать по области %SYS по %JDBCGateway

Подключение таблиц

в теории Cache предоставляет возможность выполнить маппинг внешних таблиц в таблицы Cache через Портал Управления - SQL - Wizards - «Связать таблицу»

при корректно настроенном соединении всё даже связывается, но запросы не выполняются: Cache оборачивает элементы запроса в кавычки следующим образом

 select T1."id" AS C1 from "elgg_system_log" AS T1 

и в ответ получает ошибку, так как кавычки вокруг имени таблицы некорректны, не нашёл, как это исправить, и очевидно есть зависимость от версии БД :(

pm/jdbc.txt · Последнее изменение: 2024/09/06 03:47 — 127.0.0.1