地理的に異なる場所にある4つのデータベースを使用するアプリケーションがあります。すべてのデータベースには同じテーブルが含まれており、データベース名のみが場所によって異なります。各データベースのデータを使用するレポートをアプリケーションで作成する必要があります。Javaアプリケーションからこれらのデータベース接続を作成する適切な方法は何でしょうか。また、このタスクに使用できる適切なデザインパターンはありますか?
6 に答える
質問にこのタグを付けていないので、、、、、プレーンhibernate
JDBCを扱っていると思います。JPA
ORM
そうは言っても、基盤となるデータベースを処理するためのDAOレイヤーを用意し、接続の詳細は特定の実装に任せることをお勧めします。.properties
たとえば、いくつかのファイルで接続文字列を構成できます。
[補体]
また、ここに適したAbstractFactoryまたはFactoryMethodパターンの実装であるDAOファクトリを利用することもできます。
【リンク】
- BalusCによるDAOおよびDAOファクトリーの非常に優れた実装
- コアJ2EEパターン-おそらく時代遅れですが、いくつかのアイデアを提供する可能性があります。
これを実現する方法は複数あります。
- 分散トランザクションをサポートするJavaEEコンテナを使用している場合は、そこで機能を使用できます。
- プレーンJDBCを使用している場合は、データベースごとに独自の接続を維持する必要があります。JDBCの場合:
- すべての接続の詳細を提供します
- 抽象汎用DAOを呼び出すことにより、目的のオブジェクトを提供するファサードを用意します。
- 接続に基づいてdaoを作成するファクトリがあります。
- 複数のデータベースの構成を使用できるHibernateなどのORMツールを使用します。チュートリアル。
- Springを使用している場合は、データベースごとに1つのデータソースを構成できます。ドキュメント
デザインパターン:
- ファサードパターン-複雑さと複数のデータベースの使用を隠すため。
- ファクトリ-データベース接続を自分で管理する場合。
- シングルトン-データソース用
HibernateなどのORMツールを使用して、複数の接続を簡単に処理できます。各接続を個別の構成ファイルで指定し、毎回新しいセッションファクトリを取得することで必要な接続をインスタンス化できます。
他の方法は、データソースとJNDIを使用することです:複数のデータベースに接続するJava
ファクトリパターンとシングルトンパターンを組み合わせて使用できると思います。
これを実現する理想的な方法は、OLAPのような多次元システムを使用することです。ただし、これらのデータベースからビューを作成できるかどうかを確認してください。次に、ビューをクエリする必要があります(つまり、単一のデータベース接続のみ)。また、必要に応じて、複数のデータベース接続を引き続き使用できます。
とても簡単です:)
1.データソースを作成してDBへの接続を試行します
public DataSource getDataSource(String db) throws Exception {
DataSource dt = null;
InitialContext ic = null;
try {
if(db.trim().equals("you_database_name")) {
dt = (DataSource)ic.lookup("jdbc/connection_name");
} else if(db.trim().equals("you_database_name")) {
dt = (DataSource) ic.lookup("jdbc/connection_name");
}
return dt;
} catch(NamingException n) {
throw new Exception("Err getDataSource (ServiceLocator) NamingException - " + n.getMessage());
}
2.クラスデータベースを作成します。この時点ですべての接続を閉じることを忘れないでください。
public class DataBases {
public YouNameDataSourceClass dataSrc;
public DataBases() throws Exception {
super();
dataSrc = new YouNameDataSourceClass.getDataSource();
}
public Connection getConnectionAS400() throws Exception {
return locator.getDataSource("you_database_name").getConnection();
}
public Connection getConnectionOracle() throws Exception {
return locator.getDataSource("you_database_name").getConnection();
}
public Connection getConnectionSQLServer() throws Exception {
return locator.getDataSource("you_database_name").getConnection();
}
}
見栄え。
XML構成のHibernateでSpringMVCを使用していると仮定して、次の手順に従います。
ファイル内のすべてのデータベースのBeanを作成し
spring-servlet
ます。<bean id="dataSource1" Class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=database1"/> <property name="username" value="abc" /> <property name="password" value="abc@123" /> </bean>
sessionFactory
Spring-servletファイルに必要なすべてのデータベースのBeanを作成します。<bean id="datasource1SessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="database1"/> <property name="packagesToScan" value="com.id4.iprod.entity"/> <property name="hibernateProperties"> <props> <prop key="hibernate.hbm2ddl.auto"> </prop> <prop key="hibernate.dialect"> org.hibernate.dialect.SQLServer2012Dialect </prop> </props> </property> </bean>
ここで、DAOで目的のデータベースのセッションを開き、目的のデータベースから目的の結果にアクセスする必要があります。
Session datasource1= this.datasource1SessionFactory.openSession();