複数のデータソースの設定プロセスのJava開発に関する記録、
参考ブログ:https://blog.csdn.net/weinichendian/article/details/72903757、私がここにいるspringboot2.0エラー内のコンテンツを除く、統合された、としたコンテンツの内側にあまりにも言いませんでした詳細な説明
1.プロファイルapplication.yml
担当者:#数据源1 ドライバ - クラス - 名:com.mysql.cj.jdbc.Driver JDBC -urlます。jdbc:mysqlの:// ?localhostを:3307 /人useSslオプション=偽&useUnicode =真&characterEncoding = UTF8&useJDBCCompliantTimezoneShift =真&useLegacyDatetimeCode =偽&serverTimezone = UTC&allowMultiQueries =真&allowPublicKeyRetrieval =真の ユーザ名:ルート パスワード: ******* USERAUTH:#数据2つの源 ドライバ - クラス - 名:com.mysql.cj.jdbc.Driverの JDBCの -urlます。jdbc:mysqlの://localhostを:?3307 /ユーザーuseSslオプション=偽&useUnicode =真&characterEncoding = UTF8&useJDBCCompliantTimezoneShift =真&useLegacyDatetimeCode =偽&serverTimezone = UTC&allowMultiQueries =真&allowPublicKeyRetrieval =真の ユーザ名:ルート パスワード: ******
2.さまざまなデータソースの列挙:
パブリック列挙DataSourceEnum { マスター、よだれ;}
3.列挙型クラスツールセット
パブリック クラスDataSourceContextHolder { プライベート 静的 最終のThreadLocal <DataSourceEnum> CONTEXT_HOLDER = 新規のThreadLocal <DataSourceEnum> (){ @Overrideが 保護DataSourceEnumはinitialValueを(){ 戻りDataSourceEnum.masterと、 } }。 パブリック 静的 ボイドsetDataSourceType(DataSourceEnum型){ CONTEXT_HOLDER.set(タイプ)。 } パブリック 静的DataSourceEnum getDataSourceType(){ 戻りCONTEXT_HOLDER.getを(); } パブリック 静的 ボイドresetDataSourceType(){ CONTEXT_HOLDER.set(DataSourceEnum.master)。 } }
4.カスタム注釈
@Retention(RetentionPolicy.RUNTIME)// 実行時に可視 @Target(ElementType.METHOD)// 注釈方法は、上で使用することができる 公共の@ インタフェースDataSourceTypeAnnoが{//サービス層のメソッドの使用を追加@DataSourceTypeAnno(DataSourceEnum。データソースデータ・ソースが使用される列挙型)
DataSourceEnum値()デフォルトDataSourceEnum.master。}
5.aop傍受:ASPのここでの使用
輸入org.aspectj.lang.ProceedingJoinPoint。 輸入org.aspectj.lang.annotation.Around; 輸入org.aspectj.lang.annotation.Aspect; 輸入org.aspectj.lang.annotation.Pointcut; 輸入org.aspectj.lang.reflect.MethodSignature。 輸入org.springframework.core.annotation.Order。 輸入org.springframework.stereotype.Component。 輸入java.lang.reflect.Methodオブジェクト。 @Component @Aspect @Order( -100 )//为了保证可以拦截到 パブリック クラスDataSourceAspect { @Pointcut(「実行(* com.yzy。*。 * .. *(..))」+ // 走査は、主にパケットサービス層である接点の上層に係る方法は、サービスのカスタム注釈はに、前記しましたデータ・ソース・タイプが使用されている分析、および動的データ・ソースを切り替える "&& @Annotation(com.yzy.config.DataSourceTypeAnno)" ) 公共 ボイドdataSourcePointcutは、(){ } @Around( "dataSourcePointcut()" ) パブリックオブジェクトdoAround(PJP ProceedingJoinPoint ){ MethodSignature MethodSignature = (MethodSignature)pjp.getSignature() メソッド、メソッド = methodSignature.getMethod(); DataSourceTypeAnno typeAnno = method.getAnnotation(DataSourceTypeAnno クラス)。 DataSourceEnum sourceEnum = typeAnno.value()。 もし(sourceEnum == DataSourceEnum.master){ DataSourceContextHolder.setDataSourceType(DataSourceEnum.master)。 } そう であれば(sourceEnum == DataSourceEnum.slaver){ DataSourceContextHolder.setDataSourceType(DataSourceEnum.slaver)。 } オブジェクト結果 = NULL ; 試す{ 結果 = pjp.proceedを(); } キャッチ(Throwableをスロー可能){ throwable.printStackTrace()。 }最後に{ DataSourceContextHolder.resetDataSourceType(); } 戻り値の結果; } }
6. [設定mybatisConfig =「データソース情報
インポートorg.apache.ibatis.session.SqlSessionFactory; インポートorg.mybatis.spring.SqlSessionFactoryBean; インポートorg.mybatis.spring.annotation.MapperScan; インポートorg.springframework.beans.factory.annotation.Qualifier; インポートorg.springframework.beans .factory.annotation.Value; インポート org.springframework.boot.jdbc.DataSourceBuilder; // org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;パッケージはspringboot2.0に交換され、我々は現在オンラインでこのspringboot1.5ですパッケージには、エラーとなっているでしょう インポート; org.springframework.boot.context.properties.ConfigurationProperties インポートorg.springframework.context.annotation.Bean; インポートorg.springframework.context.annotation.Configuration; 輸入org.springframework.context.annotation.Primary; 輸入org.springframework.core.io.support.PathMatchingResourcePatternResolver; 輸入org.springframework.jdbc.datasource.DataSourceTransactionManager。 インポートするjavax.sql.DataSource; 輸入java.util.HashMapを; 輸入java.util.Map; @Configuration @MapperScan(basePackages = "com.yzy。*。マッパー" )//扫描DAO层マッパー接口 パブリック クラスMyBatisConfig { / ** * @return * @throws 例外 * @Primaryは、唯一のプライマリデータソース、それ以外の場合はエラー指定する必要があります。 * / @Primary @Bean(「masterDataSource」) @ConfigurationProperties(接頭辞 =「spring.datasource.userauth」)//プレフィックスデータソース情報へのデータソースに基づいて、この変更は、デフォルトの接頭辞のデータソースを変更することができます// application.yml読みます// パブリックデータソースmasterDataSource()がスロー例外{ 返すDataSourceBuilder.create()(ビルド);. } @Bean( "slaverDataSource" ) @ConfigurationProperties(接頭辞 = "spring.datasource.personnel" )//データ・ソースに基づいてアプリケーションへのプレフィックスを// .ymlは、データソースを設定することができ、データ・ソースの情報を読み取り、アプリケーションに提供されます。 YML本だけでなく、列挙型列挙クラスを追加する必要が公共)データソースslaverDataSourceは( {例外 スロー();リターンDataSourceBuilder.create()()を構築し; } / ** 名によって注入@Qualifier *、通常、同じタイプ(タイプデータソースの、例えば、複数のインスタンス)の注入複数のインスタンスを有する * @DataSourceTypeAnno (DataSourceEnum.master)取引方法が指定するデータ・ソース * / @Bean( "dynamicDataSource" ) 公衆 dynamicDataSource dynamicDataSource(@Qualifier( "masterDataSource" )データソースmasterDataSource、 @Qualifier( "slaverDataSource" )データソースslaverDataSource){ 地図 <オブジェクト、オブジェクト> = targetDataSources 新しい新規のHashMap <オブジェクト、オブジェクト> targetDataSources.put(DataSourceEnum.master、masterDataSource)。 targetDataSources.put(DataSourceEnum.slaver、slaverDataSource); DynamicDataSourceのdataSource = 新新DynamicDataSource(); dataSource.setTargetDataSources(targetDataSources); // このメソッドは、メソッドAbstractRoutingDataSourceある dataSource.setDefaultTargetDataSource(masterDataSource); // デフォルト設定のデータソースmyTestDbDataSourceの リターンdataSource; } / ** *作成したデータソースSqlSessionFactory * / @Bean パブリック SqlSessionFactory SqlSessionFactory(@Qualifier( "dynamicDataSource")DynamicDataSource dynamicDataSource、 @value( "パッケージ-mybatis.type-エイリアス")文字列typeAliasesPackage)スロー例外{ SqlSessionFactoryBean FactoryBeanの = 新しい新; SqlSessionFactoryBean() factoryBean.setDataSource(dynamicDataSource); // 指定されたデータ・ソース(これがなければならず、そうでない場合はエラー) // 2つだけのための底*の.xmlファイル、そうでない場合は全体の動作を永続その後、xmlファイルを使用する必要があります(唯一のあなたが得ることができるコメント)、何も添加していない factoryBean.setTypeAliasesPackage(typeAliasesPackage); // 指定したパッケージのエンティティクラスの factoryBean.setMapperLocations(新新 PathMatchingResourcePatternResolver()getResources(「CLASSPATH :.マッピング/ * * / * mapper.xml ")); //パッケージのスキャンがmapper.xml 返すFactoryBean.getObjectを(); } / ** *設定トランザクションマネージャ * / @Bean 公共 DataSourceTransactionManagerのTransactionManager(DynamicDataSourceデータソース)がスロー例外{ 戻り 新しいDataSourceTransactionManager(データソース)。 } }