スプリングの複数のデータソース、および動的切り替え(再生)

1.次のように、2つの異なるデータソースを設定します

<! -数据源配置1 - >
の<beanのid = "testDataSource1"クラス= "com.alibaba.druid.pool.DruidDataSource"のinitメソッド= "initの"破壊法= "近い"> 
<プロパティ名= "driverClassName"値= "$ {db.driver}" />
<プロパティ名= "URL"の値= "$ {unity.db.jdbc.url}" /> 
<プロパティ名= "ユーザ名"値= "$ { db.login.name} "> </ property>の
<プロパティ名="パスワード」値= "$ {db.login.password}" />
<プロパティ名= "フィルタ"値= "$ {} db.filters" > </ property>の
<プロパティ名= "MAXACTIVE"値= "$ {db.pool.maxActive}"> </ property>の
<プロパティ名= "INITIALSIZE"値=」$ {db.pool.initialSize} "> </ property>の
<プロパティ名=" minIdle "値= "$ {db.pool.minIdle}"> </ property>の
<プロパティ名= "MAXWAIT"値=" $ { db.maxWait} "> </ property>の 
<プロパティ名= "timeBetweenEvictionRunsMillis"値= "$ {db.timeBetweenEvictionRunsMillis}"> </ property>の
<プロパティ名= "minEvictableIdleTimeMillis"値= "$ {db.minEvictableIdleTimeMillis}"> </ property>の
<プロパティ名= "validationQuery "値=" $ {db.validationQuery} "> </ property>の
<プロパティ名=" testWhileIdle "値= "$ {db.testWhileIdle}"> </ property>の
<プロパティ名= "testOnBorrow"値=" $ { db.testOnBorrow} "> </ property>の
<プロパティ名=" testOnReturn」値= "$ {db.testOnReturn}"> </ property>の
<プロパティ名= "poolPreparedStatements"値= "$ {db.poolPreparedStatements}"> </プロパティ>
<プロパティ名= "maxOpenPreparedStatements"値= "$ {db.maxOpenPreparedStatements}"> </ property>の
<! -监控数据库- >
<プロパティ名= "proxyFilters">
<リスト>
<REF豆= "ログフィルタ" />
</リスト> 
</ property>の

</豆>

<! -数据源配置2 - >
の<beanのid = "testDataSource2"クラス= "com.alibaba.druid.pool.DruidDataSource"のinitメソッド= "initの"破壊法= "近い"> 
<プロパティ名= "driverClassName"値= "$ {db.driver}" />
<プロパティ名= "URL"の値= "$ {pub.db.jdbc.url}" /> 
<プロパティ名= "ユーザ名"値= "$ { db.login.name} "> </ property>の
<プロパティ名="パスワード」値= "$ {db.login.password}" />
<プロパティ名= "フィルタ"値= "$ {} db.filters" > </ property>の
<プロパティ名= "MAXACTIVE"値= "$ {db.pool.maxActive}"> </ property>の
<プロパティ名= "INITIALSIZE"値=」$ {db.pool.initialSize} "> </ property>の
<プロパティ名=" minIdle "値= "$ {db.pool.minIdle}"> </ property>の
<プロパティ名= "MAXWAIT"値=" $ { db.maxWait} "> </ property>の 
<プロパティ名= "timeBetweenEvictionRunsMillis"値= "$ {db.timeBetweenEvictionRunsMillis}"> </ property>の
<プロパティ名= "minEvictableIdleTimeMillis"値= "$ {db.minEvictableIdleTimeMillis}"> </ property>の
<プロパティ名= "validationQuery "値=" $ {db.validationQuery} "> </ property>の
<プロパティ名=" testWhileIdle "値= "$ {db.testWhileIdle}"> </ property>の
<プロパティ名= "testOnBorrow"値=" $ { db.testOnBorrow} "> </ property>の
<プロパティ名=" testOnReturn」値= "$ {db.testOnReturn}"> </ property>の
<プロパティ名= "poolPreparedStatements"値= "$ {db.poolPreparedStatements}"> </プロパティ>
<プロパティ名= "maxOpenPreparedStatements"値= "$ {db.maxOpenPreparedStatements}"> </ property>の
<! -监控数据库- >
<プロパティ名= "proxyFilters">
<リスト>
<REF豆= "ログフィルタ" />
</リスト> 
</ property>の

</豆>

2.次のように、動的スイッチングデータベースを実現することができ、AbstractRoutingDataSource determineCurrentLookupKey実装方法を継承するクラスの定義:

パブリッククラスDynamicDataSourceはAbstractRoutingDataSource {延び
@Override
保護オブジェクトdetermineCurrentLookupKeyを(){
(DataSourceContextHolder.getDataSourceTypeを返します)。
}
}

3.対応するデータソース名に設けられた現在の工具スレッドを設定するためのクラス変数を定義します。

{クラスDataSourceContextHolderパブリック
プライベート静的最終のThreadLocal <文字列> =新しい新しいContextHolderのThreadLocal <文字列>();
/ **
* @description:設定されているデータソースのタイプ
* @paramのdataSourceTypeデータベースタイプ
* @return無効
* @throws
* /
パブリック静的な無効setDataSourceType(文字列DataSourceType){
contextHolder.set(DataSourceType);
}

/ **
* @description:取得データ・ソース・タイプ
* @param 
* @returnストリング
* @throws
* /
パブリック静的文字列getDataSourceType(){
contextHolder.getを返します() ;
}

/ **
* @description:クリアデータソースタイプ
* @param 
* @return無効
* @throws
* /
パブリック静的ボイドclearDataSourceType(){
contextHolder.remove()。
}
}

そして、春の構成で、次のように:

<! -编写春配置文件的配置多数源映射关系- >
<beanクラス= "com.sino.access.database.DynamicDataSource" ID = "データソース">
<プロパティ名= "targetDataSources">
<マップキー-タイプ= "java.lang.Stringで">
<エントリ値-REF = "testDataSource1"キー= "<スパンのスタイル="フォントファミリー:ゴシック、ヘルベチカ、サンセリフ; "> testDataSource1 </ span>の<スパンのスタイル= "フォントファミリ:ゴシック、ヘルベチカ、サンセリフ;"> "> </ entry>の</ span>を
<エントリ値-REF =" testDataSource2"キー= "testDataSource2"> </ entry>の
</ MAP>
</プロパティ>
<プロパティ名= "defaultTargetDataSource" REF = "testDataSource1">
</ property>の
</豆>

それぞれ2つのデータソースとキーにtestDataSource1 testDataSource2に対応するような構成では、デフォルトのデータベースはtestDataSourceあります。
4.工程の後、無取引管理データベースと、動的切り替えは、データベース内に既に達成されてもよいです。それはトランザクション管理データベースに来るなら、あなたは、データベースのトランザクションでデータベースを開くために切り替える必要があり、

それ以外の場合は、データベースが唯一の力と、次のデータベース操作に入ることができる切り替えます。次のようにAOPは、トランザクションデータベースのオープン前に、ハンドオーバ処理データベースのカテゴリを定義することができます。

パブリッククラスDataSourceAspectはMethodBeforeAdvice、AfterReturningAdviceを実装します 
{

@Override
公共ボイドafterReturning(、のreturnValue、メソッドのメソッドをオブジェクト
[]引数、オブジェクトターゲットオブジェクト)のThrowable {スロー
// TODO自動生成方法スタブ
DataSourceContextHolder.clearDataSourceTypeを();
}

@Override
前公共ボイド(方法方法、[]引数、オブジェクト対象物体)
スローしたThrowable {

IF(method.isAnnotationPresent(DataSource.class)) 
{
データソースデータソース= method.getAnnotation(DataSource.class)。
DataSourceContextHolder.setDataSourceType(datasource.name())。
}

{
DataSourceContextHolder.setDataSourceType(SinoConstant.DataSourceType.unityDataSource.toString())。
}

}
}

5.設定されたデータベーストランザクションデータベース部と切替部順次、次のように

<AOP:設定>
<AOP:ポイントカットID = "transactionPointCut"発現= "実行(* com.test.service *(..)。。)" />
<AOP:アドバイザポイントカット-REF = "transactionPointCut"
advice- REF = "txAdvice"オーダー= "2" />
<AOP:アドバイザアドバイス-REF = "dataSourceExchange"ポイントカット-REF = "transactionPointCut"オーダー= "1" />
</ AOP:設定>

逐次実行順序属性セット、スプリングトランザクション管理データベースで達成動的切り替えを使用してAOP。

転送:https://www.cnblogs.com/austinspark-jessylu/p/7676190.html

おすすめ

転載: www.cnblogs.com/nietzsche2019/p/11287748.html