ターン:
この問題を解決するために複数のデータソースの春AbstractRoutingDataSource使用
複数のデータソース、例えば、別々の読み出しおよび書き込みデータベース構成、一般的です。
元のプロジェクト新たな需要の出現は、理事会の要求は、複数のデータソースの問題を伴うコードを提供するためにサーバを追加します。
次のように解決策は以下のとおりです。
図1において、第1データソースの複数
1 < ビーンID = "データソース" クラス= "org.apache.commons.dbcp.BasicDataSource" > 2 < プロパティ名= "driverClassName" 値= "net.sourceforge.jtds.jdbc.Driver" > 3 </ プロパティ> 4 < プロパティ名= "URL" 値= "はjdbc:JTDS:のSQLServer://10.82.81.51:1433; databaseNameの=基準" > 5 </ プロパティ> 6 < プロパティ名= "ユーザ名"値= "youguess" > </プロパティ> 7 < プロパティ名= "パスワード" 値= "youguess" > </ プロパティ> 8 </ ビーン> 9 < ビーンID = "dataSource2" クラス= "org.apache.commons.dbcp.BasicDataSource" > 10 < プロパティ名前= "driverClassName" 値= "net.sourceforge.jtds.jdbc.Driver" > 11 </ プロパティ> 12 < プロパティ名= "URL"値= "JDBC:JTDS:のSQLServer://10.82.81.52:1433; databaseNameの=標準" > 13 </ プロパティ> 14 < プロパティ名= "ユーザ名" 値= "youguess" > </ プロパティ> 15 < プロパティ名=」パスワード」値= "youguess" > </ プロパティ> 16 </ 豆>
2、DynamicDataSource AbstractRoutingDataSourceを継承するクラスを作成し、determineCurrentLookupKeyを達成するための方法
1つのパッケージcom.standard.core.util。
2 インポートorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource。3 パブリッククラスDynamicDataSourceは延びAbstractRoutingDataSource { 4 @Override 5 保護オブジェクトdetermineCurrentLookupKey(){ 6 リターンCustomerContextHolder.getCustomerTypeを(); 7 } 8}
3、ThreadLocalの使用は、スレッドの安全性の問題を解決します
1つのパッケージcom.standard.core.util。
2 パブリッククラスCustomerContextHolder { 3 パブリック静的最終列DATA_SOURCE_A =「データソース」。4 パブリック静的最終的な文字列DATA_SOURCE_B =「dataSource2」。5 プライベート静的最終ThreadLocalの<ストリング> contextHolder = 新規のThreadLocal <ストリング> (); 6 パブリック静的ボイドsetCustomerType(文字列customerType){ 7 contextHolder.set(customerType)。8 } 9 パブリックスタティックストリングgetCustomerType(){ 10 リターンcontextHolder.get()。11 } 12 公共静的ボイドclearCustomerType(){ 13 contextHolder.remove()。14 } 15}
図4に示すように、データソースが構成します
1 < ビーンID = "dynamicDataSource" クラス= "com.standard.core.util.DynamicDataSource" > 2 < プロパティ名= "targetDataSources" > 3 < マッピングキー型= "java.lang.Stringで" > 4 < エントリ値-REF = "データソース" キー= "データソース" > </ エントリ> 5 < エントリ値-REF = "dataSource2" キー= "dataSource2" > </ エントリ> 6 </ マップ> 7 </ プロパティ> 8 < プロパティ名= "defaultTargetDataSource" REF = "データソース" > 9 </ プロパティ> 10 </ 豆>
図5に示すように、スイッチングデータソースDAOImpl
1 CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B)。