web-dev-qa-db-ja.com

1つのアプリケーションで2つの異なるデータベースタイプを使用する

ソフトウェアJava J2EE Tomcatサーバーでホストされているアプリケーション。

[〜#〜]更新[〜#〜]

現在のソフトウェアJava WebアプリケーションJSPおよびサーブレットのみを含み、フレームワークなしまたは何か。単純なJSPおよびサーブレットOracle DBとの通信

アプリケーションの書き直しには問題はありませんが、2つのコピーが維持されるのでコードを同じにしたいので、変更を適用するときは両方に同じように適用する必要があります。異なるコードの2つのセットを書く代わりに、DB通信を処理するために中間層とコードを同じに保ちたい

同じコードのソフトウェアがホストされ、数マイル離れた2つの異なる場所(2つの別々のインスタンス)で実行されています。最初は、アプリケーションのバックエンドデータベースは同じでした(viz。Oracle)。現在、場所の1つがOracleのサポートを停止しており、オープンソースPostgresに切り替えています。

だから今(to be)シナリオはこのようなものです

ソフトウェア:Java J2EE Tomcatサーバーでホストされているアプリケーション。

データベース1:Oracle

データベース2:Postgres

異なるインスタンスを実行しているため、アプリケーションはいつでも1つのデータベースのみを使用します。

データのフェッチに使用する必要があるデータベースに応じて、アプリケーションおよびクエリからの要求を解釈できる中間体を追加できますか。はいの場合、これはそのための最良のオプションです。

これにより、アプリケーションに変更があるたびに、各コピーで一意に変更が行われ、2つの異なるコピーを維持するオーバーヘッドを回避できます。

1
S.M.09

これは基本的に、オブジェクト/リレーショナルマッピングフレームワーク( Hibernate など)が実行できることです。データベースに依存しないレイヤーとクエリ言語を提供することにより、データベースのクエリの詳細を抽象化するデータベースの上にレイヤーを提供します。 Hibernateは(データベースをクエリする他の方法の中で) [〜#〜] hql [〜#〜] を提供します:

from Cat as cat
left join cat.kittens as kitten
    with kitten.bodyWeight > 10.0

これは通常のSQLによく似ていますが、実際には、基礎となるデータベースシステムが使用するSQLの方言に変換される中間言語です。

5
JDT

これは Strategy デザインパターンを使用する良い機会のようです。バックエンドが何であるかに応じて、環境をチェックし、適切なコードを実行するデータアクセス戦略があります。 「環境のチェック」は、環境変数を使用するような単純なものでも、アプリケーションの初期化中に適切なクエリハンドラーを注入するようなより高レベルなものでもかまいません(Springまたは別のDIフレームワークを使用して簡単に実行できます)。

0
TMN