Можно ли использовать Render Mapping, если входная и выходная БД находятся на двух разных серверах баз данных - PullRequest
0 голосов
/ 25 февраля 2019

Я работаю над проектом миграции, из которого читается таблица, а некоторые поля перемещаются в другую таблицу.Он реализован таким образом, что клиентское приложение 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 Ответ

0 голосов
/ 25 февраля 2019

Удалось исправить проблему после следующего предложения от моего руководителя.Помимо 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-with-resources,

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.

...