0

私のSpring MVCアプリケーションでは、フロントエンドでユーザーが選択した機能に基づいて、特定の時間に複数のデータベースに接続する必要があります。言いましょう:

1. 3 つの異なる環境 (PROD、PRE-PROD、ステージングなど...) があります。

2.ユーザーは、指定されたデータベースのテーブルのリストを表示したいと考えています。ユーザーは、選択ボックスから項目を選択して送信します。ユーザーの選択に基づいて、それぞれのデータベースに接続して結果を取得する必要があります。

3.一部のデータベースがダウンすることがあります。各データベースの JNDI データ ソースを作成し、それらを jdbcTemplate にマップすると、これらすべての jdbcTemplaates が DAO のプロパティとして定義されます。

<bean id="prodDataSource" ref="prodDSPool"/>
<bean id="preProdDataSource" ref="preProdDSPool"/>
<bean id="statgingDataSource" ref="stagingDSPool" />
...
...

そして、私は私のDAOに他ならない別のBeanを持っています

<bean id="myConnectionsDAO" class="com.example.MyConnectionsDAOImpl">
       <property name="prodDataSource">
             <ref bean="prodDataSource"/>
       </property>
       <property name="preProdDataSource">
             <ref bean="preProdDataSource"/>
       </property>
       <property name="preProdDataSource">
             <ref bean="preProdDataSource"/>
       </property>
</bean>

MyConnectionDAO は、上記のプロパティの getter と setter を持つ pojo です。

上で述べたように、ユーザーの選択に応じて、サービスクラスは関連するデータソースを取得し、jdbcTemplate を構築し、次のようにデータベースにクエリを実行します

if(env.equalsIgnoreCase(EnvEnum.PROD.toString())
{
  JdbcTemplate prodTemplate = new JdbcTemplate(myConnectionsDAO.getProdDataSource());
prodTemplate.queryForList("select name form sysibm.systables where creator='admin');
//Core business logic to analyze those tables and proceed... 
}else if {//preprod logic} else if{//staging logic}

そして、DB2 データベースからのデータを操作する複雑な機能がたくさんあります。データソースを挿入しているので、Spring config を使用して dao にプロパティです。何らかの理由で、1 つのデータベース/データ ソースがダウンしている場合、1 つ以上のデータ ソースがダウンしているため、アプリケーションを使用できず、nullpointer を取得します。

これらのエラーを処理するにはどうすればよいですか? 基本的に、少なくとも 1 つの DS が稼働している場合は、アプリを稼働させたいと考えています。そして、上記の構成を使用して構成された約 50 のデータベースがあります。

私はかなり混乱しており、この問題を解決する方法についての手がかりが得られていません。よろしくお願いします...

4

1 に答える 1

0

基本的に、データベースごとに独自の Spring Application Context を管理する必要があります。

つまり、特定のデータベースのルートアプリケーション コンテキストの子としてアプリケーション コンテキストを開始します。次に、動的データベース/データソース アプリケーション コンテキストのライフサイクルを今後管理する必要があります。

もう 1 つのオプションは、このルーティングを舞台裏で自動的に行うカスタムの単一データソースを作成することです。あなたの編集に基づいて、どれが最良の選択肢のように見えますか.

public class RoutingDatasource implements DataSource, ApplicationContextAware {

    private volatile DataSource realDataSource;
    private ApplicationContext ac;

    // You must do some thread locking here that will be rather complicated.
    // That is not included in this example
    public void switchDatasource(String name) {
        this.realDataSource = this.ac.getBean(name, DataSource.class);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.ac = applicationContext;
    }

    // delegate to realDataSource


}

データソース オブジェクトを安全にロックする方法を理解する必要があります。お任せします(時間切れですみません)。

于 2012-05-17T21:34:07.153 に答える