기본적으로 인터넷의 기사에는 여러 데이터 소스 또는 동적 데이터 소스 만있는 반면 최근 프로젝트에는 동시에 두 가지 방법을 사용해야합니다. 참조 구성 방법을 기록해 봅시다.
응용 프로그램 시나리오
이 프로젝트는 두 개의 다른 데이터베이스 A와 B를 동시에 연결해야하며, 마스터 슬레이브 아키텍처, 하나의 쓰기 라이브러리 및 다중 읽기 라이브러리입니다.
여러 데이터 소스
먼저 Spring.datasource.* Properties.properties 파일의 속성을 읽고 단일 데이터 소스를 자동으로 구성하기 때문에 Spring.datasource. @SpringBootApplication 주석에 제외 속성을 추가하십시오.
@SpringBootApplication (제외 = {dataSourceAutoConfiguration.class}) 공개 클래스 TitanWebApplication {public static void main (String [] args) {springApplication.run (titanwebapplication.class, args); }}그런 다음 Application.Properties에서 멀티 데이터 소스 연결 정보를 구성하십시오.
# 타이탄 도서관 spring.datasource.titan-master.url = jdbc : mysql : // xxxx : port/titan? char sername = spring.datasource.titan-master.password = spring.datasource.titan-master.driver class-name = com.mysql.jdbc.driver# 연결 풀 구성# 생략# 기타 라이브러리 spring.datasource.db2.url = jdbc : mysql : // xxxx : port/titan2? char
자동 데이터 소스 구성을 비활성화 했으므로 다음 단계에서 이러한 데이터 소스를 수동으로 작성해야합니다.
@ConfigurationPublic 클래스 DataSourceConfig {@Bean (name = "titanmas } @Bean (name = "ds2") @configurationProperties (prefix = "spring.datasource.db2") // application.properteis public dataSource dataSource2 () {return dataSourceBuilder.create (). build (); }}다음으로 다른 데이터 소스를 사용하려면 두 개의 mybatis sqlsessionfactory를 구성해야합니다.
@configuration @mapperscan (basepackages = { "titan.mapper"}, sqlsessionfactoryref = "sqlsessionfactory1") public class mybatisdbaconfig {@autowired @qualifier ( "titanmasterds") 개인 데이터 소스 DS1; @Bean public sqlsessionFactory sqlsessionFactory1 ()는 예외를 {sqlsessionCactoryBean infactoryBean = new sqlsessionFactoryBean (); FactoryBean.SetDatasource (DS1); // Titan Data Source를 사용하여 Titan 라이브러리에 연결합니다. return factorybean.getObject (); } @bean public sqlsessiontemplate sqlsessiontemplate1 ()은 예외 {sqlsessiontemplate template = new sqlsessiontemplate (sqlsessionteMplate1 ()); // 위의 공장을 사용하여 템플릿을 반환합니다. }}위의 구성 후에, Titan.Mapper의 Mapper 인터페이스는 Titan Data Source를 사용합니다. 마찬가지로 두 번째 sqlsessionfactory를 사용할 수 있습니다.
@configuration @mapperscan (basepackages = { "other.mapper"}, sqlsessionfactoryref = "sqlsessionfactory2") public class mybatisdbbconfig {@autowired @qualifier ( "ds2") private dataSource ds2; @bean public sqlsessionFactory sqlsessionFactory2 ()는 예외를 {sqlsessionFactoryBean factoryBean = new sqlsessionFactoryBean (); FactoryBean.SetDatasource (DS2); Return FactoryBean.getObject (); } @bean public sqlsessiontemplate sqlsessiontemplate2 ()는 예외 {sqlsessiontemplate template = new sqlsessiontemplate (sqlsessionTemplate2 ()); 리턴 템플릿; }}이러한 구성을 완료 한 후 2 개의 Mapper Titan.mapper.usermapper 및 기타 .mapper.rolemapper가 있다고 가정하십시오. 전자를 사용하면 타이탄 라이브러리가 자동으로 연결되고 후자는 DS2 라이브러리에 연결됩니다.
동적 데이터 소스
동적 데이터 소스를 사용하려는 원래 의도는 응용 프로그램 계층에서 읽기 및 쓰기, 즉 프로그램 코드의 다른 쿼리 메소드를 제어하여 다른 라이브러리에 연결할 수 있습니다. 이 방법 외에도 데이터베이스 미들웨어도 좋은 선택입니다. 이 장점은 데이터베이스 클러스터가 응용 프로그램의 단일 라이브러리에만 노출되며 데이터 소스의 코드 로직을 전환 할 필요가 없다는 것입니다.
맞춤형 주석 + AOP를 통해 동적 데이터 소스 전환을 알고 있습니다.
먼저 ContexTholder를 정의하여 현재 스레드에서 사용하는 데이터 소스 이름을 저장합니다.
공개 클래스 DataSourceContexTholder {public static final logger log = loggerfactory.getLogger (dataSourceContexTholder.class); / *** 기본 데이터 소스*/ public static final String default_ds = "Titan-Master"; 개인 정적 최종 ThreadLocal <string> ContexTholder = New ThreadLocal <> (); // 데이터 소스 이름 공개 static void setdb (String dbtype) {log.debug ( "{} 데이터 소스로의 스위치", dbtype); contextholder.set (dbtype); } // 데이터 소스 이름 가져 오기 공개 static string getDb () {return (ContexTholder.get ()); } // 데이터 소스 이름 지우기 공개 정적 void cleardb () {ContexTholder.remove (); }}그런 다음 javax.sql.datasource 인터페이스의 구현을 사용자 정의하십시오. 여기서 당신은 Spring이 우리를 위해 미리 구현 한 부모 클래스 AbstractroutingDatasource를 상속하면됩니다.
Public Class DynamicDatasource는 AbsTractroutingDatasource를 확장합니다. {private static final logger log = loggerfactory.getLogger (DynamicDatasource.class); @override Protected Object DegeineCurrentLookUpkey () {log.debug ( "데이터 소스는 {}", DataSourceContexTholder.getDB ()); DataSourceContexTholder.getDB ()를 반환합니다. }}동적 데이터 소스 생성 :
/ *** 동적 데이터 출처 : AOP* @return*/ @Bean (name = "dynamicDs1")을 통해 다른 데이터 소스 간의 동적 전환 공개 데이터 소스 DataSource () {DynamicDatasource DynamicDatasource = New DynamicDatasource (); // 기본 데이터 소스 DynamicDatasource.setDefaultTargetDatasource (DataSource1 ()); // 멀티 데이터 소스 맵 구성 <개체, 개체> dsmap = new Hashmap (5); dsmap.put ( "Titan-Master", DataSource1 ()); dsmap.put ( "ds2", dataSource2 ()); DynamicDatasource.SetTargetDatasources (DSMAP); DynamicDatasource를 반환합니다. }사용자 정의 주석 @ds는 인코딩시 메소드가 사용하는 데이터 소스를 지정하는 데 사용됩니다.
@retention (rendentionpolicy.runtime) @target ({elementtype.method}) public @interface ds {string value () 기본 "Titan-Master";}스위칭 로직을 구현하려면 AOP 섹션을 작성하십시오.
@agage@componentpublic class dynamicDatasourceaspect {@before ( "@annotation (ds)") public void beforeswitchds (joinpoint point) {// 현재 액세스 클래스 <?> className = point.getTarget (). getClass (); // 액세스 메소드를 가져옵니다. // 메소드 클래스의 매개 변수 유형을 가져옵니다. String DataSource = DataSourceContexTholder.default_ds; try {// 액세스 된 메소드 객체는 메소드 메소드 = classname.getMethod (MethodName, ArgClass)입니다. // @DS 주석이 존재하는지 여부를 결정합니다 (method.isAnnotationPresent (ds.class)) {ds annotation = method.getAnnotation (ds.class); // 주석에서 데이터 소스 이름을 꺼냅니다. DataSource = Annotation.value (); }} catch (예외 e) {e.printstacktrace (); } // 데이터 소스 DataSourceContexTholder.setdb (DataSource); } @after ( " @annotation (ds)") public void afterswitchds (joinpoint point) {dataSourceContexTholder.cleardb (); }}위의 구성을 완료 한 후 이전 SQLSESSSION FACTORY 구성에서 DynamicDatAsource를 지정하여 DynamicDatAsource를 사용하여 서비스의 데이터 소스를 행복하게 전환합니다.
@autowired 개인 useramodelmapper useramapper; @ds ( "Titan-Master") public String ds1 () {return userAmapper.SelectByPrimaryKey (1) .getName (); } @ds ( "ds2") public String ds2 () {return userAmapper.SelectByPrimaryKey (1) .getName (); }요약
위는 Spring Boot + Mybatis 멀티 데이터 소스 및 편집기가 귀하에게 소개 한 동적 데이터 소스 구성 방법입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!