異なる技術を使用して同じデータベースにアクセスする2つのチームがあります。 1つはJPA(Hibernate、具体的には)です。もう一方はプレーンJDBCを使用します。JPAとプレーンJDBC DAOの実装を混在させるとどのような問題が発生する可能性がありますか?
私は、各チームが各テクノロジーのデフォルト設定やベストプラクティスを使用していることを前提に、懸念事項のリストを作成するように求められました。
これは新しいデータベースです。スキーマがJPAチームだけで設計されているとか、JDBCチームだけで設計されているとしたら、どちらもそのスキーマにアクセスしようとしています。
あなたはあなたの経験を教えていただけませんか?
更新日:私はここで意見を求めていません。私はJPAかJDBCが "より良い"かどうかは気にしません。私は、2つの技術を混在させる際の相互運用性の問題の客観的なリストを求めています。
シナリオ:ここ
は私が探しているものの一例であるユーザーは、行を読み込み、メモリにそれを修正し、それをデータベースに戻って保存します。
- JPAがオプティミスティック・ロックを使用する場合、各表に
version
列を追加します。 - トランザクションがコミットされると、JPAは、行が読み取られた時刻と更新された時刻の間でバージョンが変更されたかどうかを確認します。バージョンが変更された場合、例外がスローされます。そうでなければ、コミットを続行できます。
- JDBC実装でテーブルロック(a.k.a.pessimistic locking)を使用する場合は、
SELECT ... FOR UPDATE
を使用して同時更新を防止します。 JDBCの実装は、JPAの大会を認識していないとコミットの
version
を更新しないとどうなるか想像してみて:- JPAは
SELECT
を使用して行を読み取り、JDBCを読み込む1. - に等しい
version
を見て行はSELECT ... FOR UPDATE
を使用しています。 - JDBCは、
version
をインクリメントせずに行を更新します(トランザクションをコミットします)。 - JPAは行を更新しようとします。
version
はまだ1に等しいので、コミットは完了します。 - JPA(手順4)がJDBCの更新を邪魔しました(手順3)。
- JPAは
レッスンは学んだ:JDBCの実装はversion
列を更新するために知っておく必要があります。
は、私はそのデータベースの前でRESTサービスを置くことをお勧めしたいJPA第二レベルのキャッシュを使用することはできません。いずれのチームも直接アクセスする必要はありません。あるサービスにサービスを書き込んで、一貫した方法でサービスにアクセスさせます。 – duffymo
@duffymo私は同じ勧告をしましたが、「パフォーマンス上の理由から」強い圧力があります。この質問の結果として弾薬が多ければ多いほど、あなたの提案が出る確率は高くなります。 – Gili
共有データベースに対して直接読み取りを許可しないでください。ただし、データの一貫した操作のために、更新プログラムをREST APIまたはメッセージブローカーのいずれかに通す必要があります。 – Naros