Как сделать так, чтобы мой webApp плавно переключался между разными СУБД (независимость от БД)?

У меня есть веб-приложение Java, в котором Informix используется в качестве внутренней базы данных. Многие таблицы в моей схеме содержат столбцы типа CLOB, BLOB & SERIAL8. Теперь я принял решение использовать SQL Server вместо Informix, но обнаружил проблему при преобразовании указанных выше типов данных в соответствующие типы SQL Server, и я столкнусь с той же проблемой, когда, например, я обратился к DB2 или Oracle, я также обнаружил проблема в сопоставлении отношений между таблицами, поскольку каждый поставщик БД имеет свое собственное представление отношений.

Можно ли спроектировать схему приложения и базы данных так, чтобы она могла взаимодействовать с любым сервером базы данных независимо от его типа и без изменения типов данных столбцов? Я слышал о DDLUtils & JOOQ, но я не знаю, подходят ли они мне или нет

5 ответов

Решение

Хорошо, есть несколько уровней абстракции, которые вы можете сделать здесь:

Во-первых, вам нужно сконцентрировать весь свой код доступа к данным в изолированных реализациях и получать к ним доступ только через интерфейсы, которые предоставляют вам необходимые данные в формате, который предназначен только для вашего приложения и не зависит от структуры вашего основного хранилища данных.

Например, если вы хотите получить детали из определенного заказа клиента, убедитесь, что метод, который вы используете для поиска, имеет дело с "бизнес-идентификатором" вашего объекта, потому что фактический идентификатор может быть длинным в реляционной базе данных, но UUID в NoSQL.

Применяя это, вы не привязаны к парадигме хранения данных, вы можете свободно переключаться между плоскими файлами, в памяти, NoSQL и вашими обычными реализациями реляционных БД.

Во-вторых, попробуйте использовать ORM, как Hibernate. Это позволяет писать на универсальном языке запросов и в большинстве случаев ограничивать изменения конфигурации только конкретными изменениями базы данных.

В-третьих, если вам нужно писать запросы SQL напрямую, убедитесь, что вы пишете запросы ANSI, а не специфичные для базы данных, и даже если вы действительно убедитесь, что эти запросы не являются частью вашего кода, а частью ресурса (то есть файла свойств), так что вы можно настроить и изменить его по своему усмотрению без необходимости перекомпиляции вашего двоичного файла.

Поскольку вы упомянули jOOQ, я могу дать вам некоторое представление о том, что возможно с этим инструментом, а что нет - с учетом ваших потребностей. С jOOQ вы можете:

  • Генерация исходного кода из схемы базы данных модели. Эти сгенерированные объекты схемы не зависят от диалекта SQL. Это может означать, что вы можете потерять некоторую информацию о типах, если вы используете специфичные для поставщика типы в схеме базы данных модели.
  • Напишите SQL, который будет работать на разных базах данных. jOOQ обрабатывает специфические для вас SQL-диалекты. Многие пользователи jOOQ используют jOOQ для запуска приложений с такими комбинациями, как [Oracle, Postgres], [Oracle, SQL Server, HSQLDB, Sybase] и т. Д.

С JOOQ вы не можете:

  • Обрабатывать DDL, необходимый для обеспечения совместимости между различными базами данных. jOOQ не поддерживает абстракции DDL. DdlUtils может быть хорошим решением для этого, хотя.
  • Используйте Informix. Официально Informix не поддерживается (пока)

Как уже отмечали другие, в зависимости от того, насколько мало "SQL" вы действительно хотите сделать, Hibernate может быть лучшим выбором. Если вы готовы сократить требования к HQL или JPQL, то Hibernate также обрабатывает:

  • Поддержка Informix SQL диалекта
  • Генерация DDL, если вы используете подход сначала модель домена (в отличие от jOOQ, который поддерживает только подход сначала модель базы данных)

Обратите внимание, вы также можете использовать комбинацию Hibernate и jOOQ. Смотрите также этот связанный вопрос:

Платформы ORM, используемые только для вставки / запросов только приложений

Поскольку это приложение Java, вы можете перейти на уровень ORM, такой как Hibernate, который будет абстрагировать детали базы данных.

Hibernate поддерживает более 20 баз данных с существующими диалектами, и не так сложно создать свою собственную. Я должен был сделать это для совместимости с устаревшей базой данных Informix SE 7.32.

Вы используете независимый от базы данных API (например, JDBC) для написания своего кода, но храните ваш SQL во внешних текстовых файлах; формат ключ / значение удобен. Во время выполнения вы загружаете запросы, необходимые для данной базы данных.

Единственный способ добиться независимости данных на основе SQL- это использовать ANSI SQL, но это может не обеспечить достаточную функциональность для требований ваших приложений.

Даже если бы вы использовали JDBC и сохраняли свои операторы SQL внешними, я не думаю, что можно достичь независимости от баз данных на основе SQL. Я думал, что ANSI SQL- это шаг к этой цели, но производители БД добавили свои собственные: надмножества к ANSI SQL, типы данных, синтаксис именования переменных и т. Д.

Другие вопросы по тегам