Можно ли использовать Render Mapping, если входная и выходная БД находятся на двух разных серверах баз данных
Я работаю над проектом миграции, в котором таблица читается, а определенные поля перемещаются в другую таблицу. Он реализован таким образом, что клиентское приложение Java считывает исходную таблицу самостоятельно, а затем результаты помещаются в Pojo
и POST
запрос сделан с использованием этого Pojo
в качестве тела запроса к REST-серверу, который затем выполняет задачу записи в другую таблицу. В настоящее время я использую JOOQ
в моем клиентском приложении для чтения из исходной таблицы, без генерации кода. я использую String
литералы для сопоставления со столбцами таблицы и API построения идентификаторов, например так (выберите пример):
return ctx.select(field(name(ID)),
field(name(CUSTOMER_ID)),
field(name(SIZE)),
field(name(NAME)),
field(name(CONTENT)))
.from(table(TABLE))
.where((field(name(UPLOAD)).eq((byte) 0)));
Ситуация такова, что мне нужно прочитать одну и ту же таблицу из нескольких баз данных, и у меня также есть доступ к artifactory
он содержит сгенерированные JOOQ классы всех таблиц, включая ту, из которой мне нужно читать. Теперь проблема в том, что сгенерированные JOOQ классы приходят с определенного сервера базы данных. A
и таблица, из которой мне нужно прочитать, находится внутри базы данных на сервере базы данных B
, Когда я попытался прочитать таблицу, используя сгенерированный класс из artifactory
Я получаю сообщение об ошибке "Таблица не существует". "Таблица" в данном контексте относится к таблице базы данных, которая использовалась для генерации JOOQ, с другого сервера базы данных. Есть ли способ настроить RenderMapping
это устанавливает input
в базу данных на сервере A
а также output
на сервер, с которого я сейчас читаю? Я настроил RenderMapping
между двумя базами данных на одном сервере, но не знаю, работает ли он на двух разных серверах баз данных. Главное, что я пытаюсь сделать здесь, это использовать предварительно сгенерированные классы JOOQ из artifactory
читать из одной таблицы, не создавая свою собственную.
1 ответ
Удалось исправить проблему после следующего предложения от моего руководителя. Помимо Settings
Я также должен был использовать Configuration
, Что-то вроде этого:
Configuration jooqConfig = new DefaultConfiguration();
Затем создайте новый Settings
с отображением рендера.
Settings jooqSettings = new Settings()
.withRenderMapping(new RenderMapping().withSchemata(
new MappedSchema().withInput(sourceDb).withOutput(outputDb)))
.withRenderFormatted(true);
Назначьте настройки и SQLDialect
в jooqConfig
jooqConfig.set(jooqSettings);
jooqConfig.set(SQLDialect.MARIADB);
и, наконец, внутри попытки с ресурсами,
try (DSLContext ctx = DSL.using(jooqConfig.derive(getDataSource()))) {
/* getDataSource() returns a HikariDataSource with output db credentials */
do something, for ex., ctx.select()
}
Очевидно, мне нужно было только сказать jOOQ, чтобы использовать sourceDB
схема для всех баз данных, так как она является исходной базой данных для генерации JOOQ, а также не нужно добавлять какой-либо плагин Jooq внутри pom.xml
, Единственными вещами, которые мне были нужны, были JOOQ и artifact
связанные зависимости.