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

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


pm:jdbc

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
pm:jdbc [2023/03/15 08:14] adminpm:jdbc [2024/09/06 03:47] (текущий) – внешнее изменение 127.0.0.1
Строка 1: Строка 1:
 +Процедура подключения сторонней базы по JDBC
  
 +=== Получение драйвера JDBC для БД ===
 +
 +Например, для mariadb драйвер берётся с сайта [[https://mariadb.com/kb/en/about-mariadb-connector-j/]]
 +
 +Cкачанный драйвер ({{ :pm:mariadb-java-client-3.1.2.jar |mariadb-java-client}}) размещаем в месте, которое доступно ''cacheusr'' например 
 +<code>/lib/jvm/jre/mariadb-java-client-3.1.2.jar</code>
 +
 +данный ''jar'' содержит java-класс, который служит драйвером: ''org.mariadb.jdbc.Driver''
 +
 +=== Настройка шлюза ===
 +не нашёл, как это сделать из интерфейса ''/csp/sys/mgr/%25CSP.UI.Portal.JDBCGatewayServer.zen?''
 +поэтому пропатчил ''%Net.Remote.Service:CmdLineForJava'', добавив
 +<code>Set tClassPath = tClassPath_":/lib/jvm/jre/mariadb-java-client-3.1.2.jar"</code>
 +
 +после этого в интерфейсе при старте шлюза соответствующая команда отображается как
 +<code>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 </code>
 +
 +если взять соответствующую команду, добавить в неё ''-verbose:class'', то grep'ом можно убедиться, что класс подгружается
 +<code>
 +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]
 +
 +</code>
 +
 +Возможно, то же самое можно сделать программно, открыв соответствующий экземпляр ''%Net.Remote.Java.JavaGateway'', можно посмотреть.
 +
 +при необходимости в шлюзе указывается файл журнала, например ''jdbcSqlGateway.log'', тогда соединение будет логироваться в ''/opt/cache/mgr/jdbcSqlGateway.log''
 +
 +=== Настройка соединения ===
 +Портал Управления - Администрирование системы - Соединения - Соединения SQL-шлюза
 +
 +/csp/sys/mgr/UtilSqlGateways.csp
 +
 +  * Тип соединения: JDBC
 +  * Имя соединения: указываем какое-то название
 +  * Пользователь и пароль указываются из тех, которые имеют доступ к нужной БД
 +  * Имя драйвера: ''org.mariadb.jdbc.Driver''
 +  * URL: [[|jdbc:mariadb://10.160.1.106:3306/elgg_n]]
 +  * где
 +    * ''10.160.1.106'' - хост, на котором БД
 +    * ''3306'' - порт, на котором БД слушает входящие соединения (обычно 3306)
 +    * ''elgg_n'' - БД - обязательно к указанию, иначе при выполнении запросов будет ошибка, что не выбрана БД
 +
 +При корректном указании параметров кнопка "Проверить соединение" выдаёт сообщение "Соединение удачно произведено."
 +
 +=== Выполнение запросов ===
 +<code>
 +Set QHandle=$$GetJConnection^%apiGTW("testmysql")
 +</code>где ''testmysql'' - название соединения, определённого на предыдущем этапе
 +
 +создаёт глобальную переменную ''%JDBCGateway'', которая является экземпляром класса ''%Net.Remote.Java.JDBCGateway''
 +
 +и реализует собственно методы из JDBC API [[https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/]]
 +
 +для подготовки обычного запроса (запрос может быть любым, поддерживаемым соответствующей БД, то есть не обязательно объявлять AS)
 +<code>
 +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 
 +</code>
 +примеры использования можно поискать по области %SYS по %JDBCGateway
 +
 +=== Подключение таблиц ===
 +
 +в теории Cache предоставляет возможность выполнить маппинг внешних таблиц в таблицы Cache через Портал Управления - SQL - Wizards - "Связать таблицу"
 +
 +при корректно настроенном соединении всё даже связывается, но запросы не выполняются: Cache оборачивает элементы запроса в кавычки следующим образом
 +
 +<code> select T1."id" AS C1 from "elgg_system_log" AS T1 </code>
 +
 +и в ответ получает ошибку, так как кавычки вокруг имени таблицы некорректны, не нашёл, как это исправить, и очевидно есть зависимость от версии БД :(