По сути, статьи в Интернете имеют только несколько источников данных или только динамические источники данных, в то время как недавние проекты должны использовать два метода одновременно. Давайте запишем методы конфигурации для вашей ссылки.
Сценарии приложения
Проект должен одновременно подключить две разные базы данных A и B, и они оба представляют собой архитектуры мастер-раб, одна библиотека записи и несколько библиотек чтения.
Несколько источников данных
Во -первых, вы должны отключить DataSourceautoconfiguration, которая поставляется с Spring Boot, потому что он будет читать свойство Spring.datasource.* Файл Application.properties и автоматически настраивает один источник данных. Просто добавьте атрибут Exclude в аннотацию @springbootapplication:
@Springbootapplication (exkude = {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? Характерподирование = UTF-8Spring.datasource.titan-master.u Sername = Spring.Datasource.titan-master.password = Spring.Datasource.titan-master.driver-class-name = com.mysql.jdbc.driver# Конфигурация пула соединений# omit# другие библиотеки spring.datasource.db2.url = jdbc: mysql: // xxxx: port/titan2? Характерпольгинг = utf-8spring.datasource.db2.amer = spring.datasource.db2.password = spring.datasource.db2.driver-class-name = com.mysql.jdiver
Поскольку мы отключили автоматическую конфигурацию источника данных, нам нужно вручную создать эти источники данных на следующем шаге:
@ConfigurationPublic Class DataSourceConfig {@bean (name = "titanmasterds") @configurationproperties (prefix = "spring.datasource.titan-master") // Префикс соответствующей собственности в приложении.properteis public DataSource DataSource1 () {return DataSourcee.crate (). } @Bean (name = "ds2") @configurationproperties (prefix = "spring.datasource.db2") // Префикс соответствующего свойства в Application.properteis public DataSource DataSource2 () {return dataSourceBuilder.create (). Build (); }}Далее вам нужно настроить два mybatis sqlsessionFactory для использования различных источников данных:
@Configuration @mapperscan (basepackages = {"titan.mapper"}, sqlSessionFactoref = "sqlSessionFactory1") открытый класс mybatisdbaconfig {@autowired @qualifier ("titanmasterds") частный DataSource DS1; @Bean public sqlSessionFactory sqlSessionFactory1 () выбрасывает исключение {sqlSessionFactorybean factorybean = new SQLSessionFactoryBean (); Factorybean.SetDatasource (DS1); // Использование источника данных Titan для подключения к библиотеке Titan Return Factorybean.getObject (); } @Bean public sqlSessionTemplate sqlSessionTemplate1 () Throws Exception {sqlSessionTemplate Template = new SqlSessionTemplate (sqlSessionFactory1 ()); // Использование заводской настройки выше для возврата шаблона; }}После приведенной выше конфигурации интерфейс Mapper под Titan.Mapper будет использовать источник данных Titan. Точно так же вы можете использовать второй SQLSessionFactory:
@Configuration @mapperscan (basepackages = {"sother.mapper"}, sqlsessionFactoryRef = "sqlSessionFactory2") открытый класс mybatisdbbonfig {@autowired @qualifier ("ds2") private dataSource ds2; @Bean public sqlSessionFactory sqlSessionFactory2 () выбрасывает исключение {sqlSessionFactoryBean factorybean = new SQLSessionFactoryBean (); Factorybean.SetDatasource (DS2); вернуть factorybean.getObject (); } @Bean public sqlSessionTemplate sqlSessionTemplate2 () Throws Exception {sqlSessionTemplate Template = new sqlSessionTemplate (sqlSessionFactory2 ()); возвратный шаблон; }}После завершения этих конфигураций, предположим, что есть 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"; Private Static Final Threadlocal <string> contextholder = new Threadlocal <> (); // Установить имя источника данных public static void setdb (string dbtype) {log.debug ("Switch на {} источник данных", dbtype); contextholder.set (dbtype); } // Получить имя источника данных общедоступной статической строки getDB () {return (contextholder.get ()); } // Очистить имя источника данных public void void cleardb () {contextholder.remove (); }}Затем настройте реализацию интерфейса javax.sql.datasource. Здесь вам нужно только унаследовать AbstractroutingDatasource родительского класса, который Spring реализовал для нас заранее:
Общедоступный класс DynamicDataSource Extends AbstractroutingDatasource {private Static Final Logger log = loggerFactory.getLogger (dynamicDatasource.class); @Override защищенный объект degineCurrentLookupkey () {log.debug ("Источник данных is {}", dataSourceContextholder.getDb ()); вернуть DataSourceContextholder.getDb (); }}Создать динамические источники данных:
/ *** Динамический источник данных: динамическое переключение между различными источниками данных через AOP* @return*/ @bean (name = "dynamicds1") public DataSource 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 (armentPolicy.Runtime) @Target ({elementType.method}) public @Interface ds {string value () по умолчанию "Titan-Master";}Напишите разделы AOP для реализации логики переключения:
@Ampost@ComponentPublic Class DynamicDatasourceAspect {@before ("@annotation (ds)") public void beastswitchds (joinpoint point) {// Получить текущий класс класса доступа <?> Classname = point.getTarget (). GetClass (); // Получить имя метода доступа string methodname = point.getSignature (). GetName (); // Получить тип параметра класса метода [] argclass = ((methodignature) point.getSignature ()). GetParameterTypes (); String dataSource = dataSourceContextholder.default_ds; try {// объект метода, доступный для метода method = classname.getmethod (methodname, argclass); // определить, существует ли аннотация @ds, if (method.isannotationpresent (ds.class)) {ds annotation = method.getannotation (ds.class); // Установите имя источника данных в DataSource = Annotation.value (); }} catch (Exception e) {e.printstackTrace (); } // Переключение источника данных DataSourceContextholder.setDB (dataSource); } @After (" @annotation (ds)") public void afterswitchds (joinpoint point) {dataSourceContextholder.cleardb (); }}После завершения вышеуказанной конфигурации указание DynamicDataSource в предыдущей конфигурации SQLSessionFactory для использования DynamicDataSource для счастливого переключения источников данных в службе:
@Autowired private 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 Multi-Data Source-Source и метод конфигурации источника данных, представленный вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!