7

クライアントの気まぐれに応じて、Oracle、SQL Server、および MySQL に接続するように構成可能でなければならないアプリケーションを作成しています。

今までは、JDBC-ODBC ブリッジを使用し、異なる接続文字列を使用してデータベースに接続することだけを計画していました。

これはあまり効率的ではないと言われています。

  1. 複数のデータベース システムに接続するためのパターンまたはベスト プラクティスはありますか? または、使用するドライバーを選択するためですか?

  2. 構成可能にする必要がありますか?3 つのドライバーをすべて含めるか、3 つの個別のクライアントを構築しますか?

イベント ストリームからデータベースにデータをポンピング (挿入) するだけで、複雑なことは何もしていません。

4

4 に答える 4

7

構成可能にして、3 つのドライバーを含めることをお勧めします。次のようなパターンを使用できます: データベースに接続する機能を提供するスーパー クラス (DAO と呼びましょう) を作成します。これは抽象的かもしれません。

接続したいデータベースのタイプごとに具体的なサブクラスを作成します。したがって、MySQLDAO、MSSQLDAO、および OracleDAO になる可能性があります。それぞれがそれぞれのドライバーをロードし、それぞれの接続文字列を使用します。

DB の値に応じて DAO のインスタンスを作成するメソッド getDAO(DB) を使用して、別のクラス (DAOFactory と呼びましょう) を作成します。

たとえば(疑似コードで):

 if(DB.equals("MySQL")){
    DAO = new MySQLDAO();
}
return DAO;

したがって、データベースに接続する必要があるコードは、DAOFactory を呼び出して、DAO インスタンスを要求します。DB 値を外部ファイル (プロパティー・ファイルなど) に保管すると、データベースのタイプを変更するためにコードを変更する必要がなくなります。

この方法では、接続先のデータベースの種類をコードで知る必要がありません。後で 4 番目の種類のデータベースをサポートすることにした場合は、コードの残りの部分ではなく、もう 1 つのクラスを追加して DAOFactory を変更する必要があります。

于 2008-11-17T14:16:50.187 に答える
2

注意している(そしてテストしている)場合は、ストレートJDBCを使用してこれを実行し、ドライバークラスと接続情報を変更するだけです。JDBC-ODBCブリッジは一般的に低速で信頼性が低いため、絶対に避けたいと思います。ブリッジは、JDBCよりもデータベース間で異なる動作をする可能性が高くなります。

要件がリストされているほど単純な場合、DAOパスはやり過ぎだと思います。

多くの挿入を行う場合は、はるかに効率的であるため、プリペアドステートメントとバッチ更新を調査することをお勧めします。これは移植性が低くなる可能性があります-テストせずに言うのは難しいです。

于 2008-11-17T19:06:55.060 に答える
2

複雑なものが必要な場合は、Hibernate が適しています。

それ以外の場合は、接続の詳細をプロパティ ファイル (またはその他の形式の構成) に保存します。つまり、ドライバー クラス名、JDBC URL、ユーザー名、およびパスワードです。

次に、プロパティ ファイルから接続の詳細をロードし、クラスパスに正しい JAR ファイルを含めるだけで完了です。

設定をもう少し簡単にしたい場合は、Commons-DBCP などのライブラリを使用できますが、それ以外は必要なだけです (もちろん、SQL ステートメントがすべてのデータベースで機能する場合)。

于 2008-11-17T14:13:02.563 に答える
1

Datasourceを見てください。これは、データベース接続を取得するための推奨メカニズムです。

IMO これにより、管理者は、データベース、接続プーリング、およびトランザクション戦略を選択する際に最大の柔軟性を得ることができます。

Tomcat を使用している場合は、データソースを Tomcat の JNDI に登録する方法について、こちらを参照してください。

Spring を使用している場合は、 を使用してデータソースを取得できますjee:jndi-lookup

Spring を使用しているが、JNDI を使用したくない場合は、 DriverManagerDataSourceを参照して、プールされたデータソース (DBCP または C3P0) を取得する方法について説明します。

于 2008-11-17T14:41:54.223 に答える