У нас есть две команды, которые хотят получить доступ к одной базе данных с использованием разных технологий. Один использует JPA (Hibernate, если быть конкретным). Другой использует простой JDBC.Какие проблемы могут возникнуть при смешивании JPA с реализациями dao-JDBC с простым JDBC?
Меня попросили составить список проблем, предполагающих, что каждая команда использует конфигурацию по умолчанию и/или «лучшие практики» каждой технологии.
Это новая база данных, поэтому представьте, что схема разрабатывается исключительно командой JPA или исключительно командой JDBC, а затем они оба пытаются получить к ней доступ.
Можете ли вы поделиться опытом?
ОБНОВЛЕНИЕ: Я не прошу мнения здесь. Мне все равно, является ли JPA или JDBC «лучше». Я прошу предоставить объективный список проблем совместимости при смешивании двух технологий.
Вот пример того, что я ищу:
Сценарий: пользователь читает строку, изменяет его в памяти, и сохраняет его обратно в базу данных.
- Если JPA использует оптимистичную блокировку, добавив столбец
version
к каждой таблице. - Когда транзакция зафиксирована, JPA проверяет, изменилась ли версия между временем чтения строки и временем ее обновления. Если версия изменилась, она выдает исключение. Если нет, это позволяет продолжить фиксацию.
- Если реализация JDBC использует блокировки таблиц (пессимистическая блокировка a.k.a.), они используют
SELECT ... FOR UPDATE
для предотвращения параллельных обновлений. Представьте себе, что произойдет, если реализация JDBC не знает о конвенции JPA и не обновляет
version
на фиксации:- JPA читает строку, используя
SELECT
и видитversion
равным 1. - JDBC читает строка с использованием
SELECT ... FOR UPDATE
. - JDBC обновляет строку (совершая транзакцию) без увеличения
version
. - JPA пытается обновить строку. Конец проходит, потому что
version
по-прежнему равен 1. - JPA (шаг 4) просто сплел обновление JDBC (шаг 3).
- JPA читает строку, используя
Урок: Реализация JDBC необходимо знать, чтобы обновить version
колонку.
Я бы рекомендовал поставить службу REST перед этой базой данных. Ни одна из них не должна обращаться к ней напрямую. Напишите службу в одной технологии и позвольте им получить доступ к ней согласованным образом. – duffymo
@duffymo Я сделал ту же рекомендацию, но есть сильное давление на нее «по соображениям производительности». Чем больше боеприпасов я получаю в результате этого вопроса, тем выше вероятность того, что ваше предложение произойдет. – Gili
Почему бы не позволить прямое чтение против общей базы данных, но оба приложения согласны с тем, что обновления должны быть перенаправлены через API REST или брокер сообщений для последовательной манипуляции данными? – Naros