亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Spring Boot + Mybatis多數據源和動態數據源配置方法

2024-07-13 10:16:52
字體:
來源:轉載
供稿:網友

網上的文章基本上都是只有多數據源或只有動態數據源,而最近的項目需要同時使用兩種方式,記錄一下配置方法供大家參考。

應用場景

項目需要同時連接兩個不同的數據庫A, B,并且它們都為主從架構,一臺寫庫,多臺讀庫。

多數據源

首先要將spring boot自帶的DataSourceAutoConfiguration禁掉,因為它會讀取application.properties文件的spring.datasource.*屬性并自動配置單數據源。在@SpringBootApplication注解中添加exclude屬性即可:

@SpringBootApplication(exclude = {  DataSourceAutoConfiguration.class})public class TitanWebApplication { public static void main(String[] args) {  SpringApplication.run(TitanWebApplication.class, args); }}

然后在application.properties中配置多數據源連接信息:

# titan庫spring.datasource.titan-master.url=jdbc:mysql://X.X.X.X:port/titan?characterEncoding=UTF-8spring.datasource.titan-master.username=spring.datasource.titan-master.password=spring.datasource.titan-master.driver-class-name=com.mysql.jdbc.Driver# 連接池配置# 省略# 其它庫spring.datasource.db2.url=jdbc:mysql://X.X.X.X:port/titan2?characterEncoding=UTF-8spring.datasource.db2.username=spring.datasource.db2.password=spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver

由于我們禁掉了自動數據源配置,因些下一步就需要手動將這些數據源創建出來:

@Configurationpublic class DataSourceConfig { @Bean(name = "titanMasterDS") @ConfigurationProperties(prefix = "spring.datasource.titan-master") // application.properteis中對應屬性的前綴 public DataSource dataSource1() {  return DataSourceBuilder.create().build(); } @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") private DataSource ds1; @Bean public SqlSessionFactory sqlSessionFactory1() throws Exception {  SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();  factoryBean.setDataSource(ds1); // 使用titan數據源, 連接titan庫  return factoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplate1() throws Exception {  SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory1()); // 使用上面配置的Factory  return template; }}

經過上面的配置后,titan.mapper下的Mapper接口,都會使用titan數據源。同理可配第二個SqlSessionFactory:

@Configuration@MapperScan(basePackages = {"other.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory2")public class MybatisDbBConfig { @Autowired @Qualifier("ds2") private DataSource ds2; @Bean public SqlSessionFactory sqlSessionFactory2() throws Exception {  SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();  factoryBean.setDataSource(ds2);  return factoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplate2() throws Exception {  SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory2());  return template; }}

完成這些配置后,假設有2個Mapper titan.mapper.UserMapper和other.mapper.RoleMapper,使用前者時會自動連接titan庫,后者連接ds2庫。

動態數據源

使用動態數據源的初衷,是能在應用層做到讀寫分離,即在程序代碼中控制不同的查詢方法去連接不同的庫。除了這種方法以外,數據庫中間件也是個不錯的選擇,它的優點是數據庫集群對應用來說只暴露為單庫,不需要切換數據源的代碼邏輯。

我們通過自定義注解 + AOP的方式實現數據源動態切換。

首先定義一個ContextHolder, 用于保存當前線程使用的數據源名:

public class 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("切換到{}數據源", dbType);  contextHolder.set(dbType); } // 獲取數據源名 public static String getDB() {  return (contextHolder.get()); } // 清除數據源名 public static void clearDB() {  contextHolder.remove(); }}

然后自定義一個javax.sql.DataSource接口的實現,這里只需要繼承Spring為我們預先實現好的父類AbstractRoutingDataSource即可:

public class DynamicDataSource extends AbstractRoutingDataSource { private static final Logger log = LoggerFactory.getLogger(DynamicDataSource.class); @Override protected Object determineCurrentLookupKey() {  log.debug("數據源為{}", DataSourceContextHolder.getDB());  return DataSourceContextHolder.getDB(); }}

創建動態數據源:

/**  * 動態數據源: 通過AOP在不同數據源之間動態切換  * @return  */ @Bean(name = "dynamicDS1") public DataSource dataSource() {  DynamicDataSource dynamicDataSource = new DynamicDataSource();  // 默認數據源  dynamicDataSource.setDefaultTargetDataSource(dataSource1());  // 配置多數據源  Map<Object, Object> dsMap = new HashMap(5);  dsMap.put("titan-master", dataSource1());  dsMap.put("ds2", dataSource2());  dynamicDataSource.setTargetDataSources(dsMap);  return dynamicDataSource; }

自定義注釋@DS用于在編碼時指定方法使用哪個數據源:

@Retention(RetentionPolicy.RUNTIME)@Target({  ElementType.METHOD})public @interface DS { String value() default "titan-master";}

編寫AOP切面,實現切換邏輯:

@Aspect@Componentpublic class DynamicDataSourceAspect { @Before("@annotation(DS)") public void beforeSwitchDS(JoinPoint point){  //獲得當前訪問的class  Class<?> className = point.getTarget().getClass();  //獲得訪問的方法名  String methodName = point.getSignature().getName();  //得到方法的參數的類型  Class[] argClass = ((MethodSignature)point.getSignature()).getParameterTypes();  String dataSource = DataSourceContextHolder.DEFAULT_DS;  try {   // 得到訪問的方法對象   Method 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(); }}

完成上述配置后,在先前SqlSessionFactory配置中指定使用DynamicDataSource就可以在Service中愉快的切換數據源了:

@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多數據源和動態數據源配置方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本午夜在线亚洲.国产| 日韩欧美精品中文字幕| 欧美日产国产成人免费图片| 亚洲精品资源美女情侣酒店| 欧美中文字幕第一页| 国产精品91久久| 国产小视频国产精品| 亚洲色图国产精品| 欧美午夜女人视频在线| 亚洲精品免费网站| 日韩精品在线免费播放| 亚洲黄色免费三级| 亚洲视频欧洲视频| 欧美激情高清视频| 清纯唯美亚洲激情| 欧美激情欧美激情| 91老司机精品视频| 亚洲日韩中文字幕| 国产一区二区黑人欧美xxxx| 国产精品久久久久不卡| 久久亚洲一区二区三区四区五区高| 国产精品日韩av| 欧美一区亚洲一区| 日韩精品在线观看一区二区| 亚洲国产中文字幕久久网| 久久人人看视频| 日韩福利伦理影院免费| 日韩欧美在线播放| 91深夜福利视频| 色婷婷av一区二区三区久久| 91大神福利视频在线| 欧美大片va欧美在线播放| 中文字幕成人精品久久不卡| 国模精品视频一区二区三区| 国产精品高潮呻吟视频| 国产亚洲精品久久久久久牛牛| 国产精品一区二区久久| 精品亚洲一区二区| 国产一区二区三区在线| 成人国产精品色哟哟| 一区二区福利视频| 亚洲综合色激情五月| 国产精品国产亚洲伊人久久| 色老头一区二区三区在线观看| 日韩精品极品在线观看播放免费视频| 最近2019中文字幕大全第二页| 午夜精品福利电影| 国产精品久久久久久久久久尿| 自拍偷拍亚洲精品| 亚洲r级在线观看| 日韩一二三在线视频播| 久久久久久久一区二区| 欧美寡妇偷汉性猛交| 国产婷婷色综合av蜜臀av| 国产精品一区二区久久久久| 日韩精品电影网| 97欧美精品一区二区三区| 黑人精品xxx一区一二区| 亚洲性av网站| 欧美精品在线看| 亚洲第一免费网站| 国产aⅴ夜夜欢一区二区三区| 亚洲色图17p| 欧美日韩中文字幕在线视频| 久久影院模特热| 欧美精品成人91久久久久久久| 久久综合伊人77777尤物| 久久艳片www.17c.com| 国产一区二区在线免费视频| 国产精品v片在线观看不卡| 蜜臀久久99精品久久久久久宅男| 中文字幕亚洲无线码在线一区| 亚洲精品国产福利| 久久久综合免费视频| 欧美日韩国产影院| 在线观看日韩视频| 91国语精品自产拍在线观看性色| 国产精品丝袜久久久久久不卡| 97国产在线视频| 精品久久久久久久久久| 国产日韩av高清| 久久久伊人欧美| 91在线色戒在线| 亚洲精品短视频| 精品在线观看国产| 国产一区二区三区丝袜| 中文字幕自拍vr一区二区三区| 国产精品激情av电影在线观看| 国产中文欧美精品| 成人av.网址在线网站| 亚洲自拍偷拍第一页| 91av网站在线播放| 精品久久久久久电影| 亚洲一区二区在线| 国产在线播放91| 成人国产在线激情| 久久久精品亚洲| 亚洲xxxx妇黄裸体| 亚洲国产精品系列| 欧美亚洲激情视频| 性欧美长视频免费观看不卡| 亚洲成人免费网站| 欧美日韩裸体免费视频| 亚洲国产精品va在线看黑人| 日韩欧美精品中文字幕| 日本亚洲欧洲色α| 欧美极品在线播放| 久久久久久久999精品视频| 久久色免费在线视频| 91美女福利视频高清| 久久成人这里只有精品| 国产日产亚洲精品| 欧美成人精品一区| 国产精品色视频| 国产视频999| 992tv在线成人免费观看| 91青草视频久久| 色偷偷偷综合中文字幕;dd| 色噜噜狠狠狠综合曰曰曰| 久操成人在线视频| 亚洲日本成人女熟在线观看| 亚洲欧洲av一区二区| 国产精品欧美一区二区三区奶水| 国产精品第二页| 国产女同一区二区| 欧美高清一级大片| 国产一区二区三区三区在线观看| 日韩性生活视频| 欧美极品欧美精品欧美视频| 秋霞av国产精品一区| 日韩黄色在线免费观看| 中文字幕欧美日韩在线| 久久亚洲精品小早川怜子66| 日韩免费精品视频| 三级精品视频久久久久| 成人免费看片视频| 国产午夜精品全部视频在线播放| 在线观看不卡av| 日韩欧美aaa| 欧美精品亚州精品| 久久大大胆人体| 成人在线免费观看视视频| 中文字幕日韩视频| 欧美午夜丰满在线18影院| 国内揄拍国内精品少妇国语| 色播久久人人爽人人爽人人片视av| 自拍亚洲一区欧美另类| 亚洲国产精品va在线看黑人| 久久的精品视频| 日韩美女福利视频| 亚洲欧美成人精品| 日韩精品在线观看一区二区| 精品福利视频导航| 91精品国产综合久久久久久蜜臀| 亚洲视频在线视频| 成人精品网站在线观看| 欧美成人四级hd版| 日韩精品视频在线观看免费| 2021久久精品国产99国产精品| 色狠狠久久aa北条麻妃| 在线观看中文字幕亚洲| xxxx欧美18另类的高清| 欧美性猛交丰臀xxxxx网站| 日本高清不卡在线|