最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)多數(shù)據(jù)源的幾種方式總結(jié)

 更新時間:2023年08月10日 08:54:36   作者:-半度  
這篇文章主要給大家總結(jié)介紹了關于Java實現(xiàn)多數(shù)據(jù)源的幾種方式,最近項目中的工作流需要查詢多個數(shù)據(jù)源的數(shù)據(jù),數(shù)據(jù)源可能是不同種類的,需要的朋友可以參考下

一、利用Spring提供的類實現(xiàn)

1)在yml文件當中配置多數(shù)據(jù)源

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    datasource1:
      url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=false
      username: root
      password: root
      initial-size: 1
      min-idle: 1
      max-active: 20
      test-on-borrow: true
      driver-class-name: com.mysql.cj.jdbc.Driver
    datasource2:
      url: jdbc:mysql://127.0.0.1:3306/datasource2?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=false
      username: root
      password: root
      initial-size: 1
      min-idle: 1
      max-active: 20
      test-on-borrow: true
      driver-class-name: com.mysql.cj.jdbc.Driver

2) 定義一個DataSourceConfig 配置類來配置兩個數(shù)據(jù)源

@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.datasource1")
    public DataSource dataSource1() {
        // 底層會自動拿到spring.datasource中的配置, 創(chuàng)建一個DruidDataSource
        return DruidDataSourceBuilder.create().build();
    }
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.datasource2")
    public DataSource dataSource2() {
        // 底層會自動拿到spring.datasource中的配置, 創(chuàng)建一個DruidDataSource
        return DruidDataSourceBuilder.create().build();
    }
    /* @Bean
    public Interceptor dynamicDataSourcePlugin(){
        return new DynamicDataSourcePlugin();
    }
*/
    @Bean
    public DataSourceTransactionManager transactionManager1(DynamicDataSource dataSource){
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
    }
    @Bean
    public DataSourceTransactionManager transactionManager2(DynamicDataSource dataSource){
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
    }
}

3)自定義一個類 來 繼承 org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

** 在類里面注入分別注入兩個數(shù)據(jù)源**

  // 寫
    @Autowired
    DataSource dataSource1;
    // 讀
    @Autowired
    DataSource dataSource2;
        // 返回當前數(shù)據(jù)源標識
    @Override
    protected Object determineCurrentLookupKey() {
        return name.get();
            }

** 在這個類初始化完成之后,進行數(shù)據(jù)源的注入**

       // 當前使用的數(shù)據(jù)源標識
    public static ThreadLocal<String> name=new ThreadLocal<>();
    @Override
    public void afterPropertiesSet() {
        // 為targetDataSources初始化所有數(shù)據(jù)源
        Map<Object, Object> targetDataSources=new HashMap<>();
        targetDataSources.put("W",dataSource1);
        targetDataSources.put("R",dataSource2);
        super.setTargetDataSources(targetDataSources);
        // 為defaultTargetDataSource 設置默認的數(shù)據(jù)源
        super.setDefaultTargetDataSource(dataSource1);
        super.afterPropertiesSet();
    }

**在service中使用指定的數(shù)據(jù)源 **

@Service
public class FriendImplService implements FriendService {
    @Autowired
    FriendMapper friendMapper;
    @Override
    @WR("R")        // 庫2
    public List<Friend> list() {
//        DynamicDataSource.name.set("R");
        return friendMapper.list();
    }
    @Override
    @WR("W")        // 庫1
    public void save(Friend friend) {
//        DynamicDataSource.name.set("W");
        friendMapper.save(friend);
    }
}

上面采用注解的方式就是,其實是利用切面進行數(shù)據(jù)源的設置,和注釋的注釋方式類似

二、利用mybatis層次實現(xiàn)

1)分別配置兩個配置源,單獨配置

** 編寫WMyBatisConfig配置文件**

@Configuration
// 繼承mybatis:
// 1. 指定掃描的mapper接口包(主庫)
// 2. 指定使用sqlSessionFactory是哪個(主庫)
@MapperScan(basePackages = "com.datasource.dynamic.mybatis.mapper.w",
        sqlSessionFactoryRef="wSqlSessionFactory")
public class WMyBatisConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.datasource1")
    public DataSource dataSource1() {
        // 底層會自動拿到spring.datasource中的配置, 創(chuàng)建一個DruidDataSource
        return DruidDataSourceBuilder.create().build();
    }
    @Bean
    @Primary
    public SqlSessionFactory wSqlSessionFactory()
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        // 指定主庫
        sessionFactory.setDataSource(dataSource1());
        // 指定主庫對應的mapper.xml文件
        /*sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/order/*.xml"));*/
        return sessionFactory.getObject();
    }
    @Bean
    @Primary
    public DataSourceTransactionManager wTransactionManager(){
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource1());
        return dataSourceTransactionManager;
    }
    @Bean
    public TransactionTemplate wTransactionTemplate(){
        return new TransactionTemplate(wTransactionManager());
    }
}

** 編寫RMyBatisConfig 配置文件**

@Configuration
// 繼承mybatis:
// 1. 指定掃描的mapper接口包(主庫)
// 2. 指定使用sqlSessionFactory是哪個(主庫)
@MapperScan(basePackages = "com.tuling.datasource.dynamic.mybatis.mapper.w",
        sqlSessionFactoryRef="wSqlSessionFactory")
public class WMyBatisConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.datasource1")
    public DataSource dataSource1() {
        // 底層會自動拿到spring.datasource中的配置, 創(chuàng)建一個DruidDataSource
        return DruidDataSourceBuilder.create().build();
    }
    @Bean
    @Primary
    public SqlSessionFactory wSqlSessionFactory()
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        // 指定主庫
        sessionFactory.setDataSource(dataSource1());
        // 指定主庫對應的mapper.xml文件
        /*sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/order/*.xml"));*/
        return sessionFactory.getObject();
    }
    @Bean
    @Primary
    public DataSourceTransactionManager wTransactionManager(){
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource1());
        return dataSourceTransactionManager;
    }
    @Bean
    public TransactionTemplate wTransactionTemplate(){
        return new TransactionTemplate(wTransactionManager());
    }
}

2) 在serviceImpl實現(xiàn)層 單獨調(diào)用配置的Mapper代理類

 @Autowired
    private RFriendMapper rFriendMapper;
    @Autowired
    private WFriendMapper wFriendMapper;
    // 讀-- 讀庫
    @Override
    public List<Friend> list() {
        return rFriendMapper.list();
    }
  // 保存-- 寫庫
    @Override
    public void saveW(Friend friend) {
        friend.setName("loulan");
        wFriendMapper.save(friend);
    }
    // 保存-- 讀庫
    @Override
    public void saveR(Friend friend) {
        friend.setName("loulan");
        rFriendMapper.save(friend);
    }

三、Spring自動化支持

1) 引入pom依賴

 <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>

2)在service層利用注解==@DS實現(xiàn)==

@Service
public class FriendImplService implements FriendService {
    @Autowired
    FriendMapper friendMapper;
    @Override
    @DS("slave_1")  // 從庫, 如果按照下劃線命名方式配置多個  , 可以指定前綴即可(組名)
    public List<Friend> list() {
        return friendMapper.list();
    }
    @Override
    @DS("master")
    public void save(Friend friend) {
        friendMapper.save(friend);
    }
    @DS("master")
    @DSTransactional
    public void saveAll(){
        // 執(zhí)行多數(shù)據(jù)源的操作
    }
}

總結(jié) 

到此這篇關于Java實現(xiàn)多數(shù)據(jù)源的幾種方式的文章就介紹到這了,更多相關Java實現(xiàn)多數(shù)據(jù)源內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java使用Spire.Doc for Java合并多個Word文檔

    Java使用Spire.Doc for Java合并多個Word文檔

    在Java開發(fā)中,我們經(jīng)常需要將多個Word文檔合并為一個單一文件,本文將借助Spire.Doc for Java快速實現(xiàn)文檔合并,下面小編就為大家簡單介紹一下吧
    2025-09-09
  • Springboot2.0配置JPA多數(shù)據(jù)源連接兩個mysql數(shù)據(jù)庫方式

    Springboot2.0配置JPA多數(shù)據(jù)源連接兩個mysql數(shù)據(jù)庫方式

    這篇文章主要介紹了Springboot2.0配置JPA多數(shù)據(jù)源連接兩個mysql數(shù)據(jù)庫方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • MyBatis-Plus介紹及Spring Boot 3集成指南

    MyBatis-Plus介紹及Spring Boot 3集成指南

    本文介紹了MyBatis-Plus的基本特性及其與Spring Boot 3的集成步驟,通過使用MyBatis-Plus,開發(fā)者可以快速地搭建和開發(fā)數(shù)據(jù)訪問層,同時提高代碼質(zhì)量和開發(fā)效率,感興趣的朋友一起看看吧
    2024-05-05
  • Java Spire.PDF實現(xiàn)PDF表單數(shù)據(jù)自動導入與導出

    Java Spire.PDF實現(xiàn)PDF表單數(shù)據(jù)自動導入與導出

    對于Java開發(fā)者而言,處理PDF表單數(shù)據(jù)往往伴隨著諸多挑戰(zhàn),本文將借助 Spire.PDF for Java 這一強大工具,清晰地展示如何實現(xiàn)PDF表單數(shù)據(jù)的導入與導出,感興趣的小伙伴可以了解下
    2026-02-02
  • 淺談關于Java的GC垃圾回收器的一些基本概念

    淺談關于Java的GC垃圾回收器的一些基本概念

    這篇文章主要介紹了關于Java的GC垃圾回收器的一些基本概念,牽扯倒JVM內(nèi)存模型的一些知識,需要的朋友可以參考下
    2015-11-11
  • JWT在SpringBoot3中的作用及說明

    JWT在SpringBoot3中的作用及說明

    JWT是一種開放標準(RFC 7519),用于在網(wǎng)絡應用環(huán)境間安全地將信息作為JSON對象傳輸,JWT在SpringBoot中用于身份驗證、授權(quán)和無狀態(tài)性,相比傳統(tǒng)的session/cookie方式,JWT具有無狀態(tài)、易于擴展、跨域支持好、性能高等優(yōu)點,但也存在令牌體積較大
    2025-12-12
  • Java 實現(xiàn)簡單靜態(tài)資源Web服務器的示例

    Java 實現(xiàn)簡單靜態(tài)資源Web服務器的示例

    這篇文章主要介紹了Java 實現(xiàn)簡單靜態(tài)資源Web服務器的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • 使用Spring?Boot進行單元測試詳情

    使用Spring?Boot進行單元測試詳情

    這篇文章主要介紹了使用Spring?Boot進行單元測試詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Jersey實現(xiàn)Restful服務(實例講解)

    Jersey實現(xiàn)Restful服務(實例講解)

    下面小編就為大家?guī)硪黄狫ersey實現(xiàn)Restful服務(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • java設計模式之單例模式

    java設計模式之單例模式

    這篇文章主要為大家詳細介紹了java設計模式之單例模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論

宁波市| 万州区| 伊吾县| 沾益县| 含山县| 类乌齐县| 达孜县| 延庆县| 财经| 海兴县| 扎鲁特旗| 宜章县| 方城县| 榆林市| 克拉玛依市| 阿坝县| 大庆市| 宾川县| 西乌珠穆沁旗| 苍南县| 高邮市| 潼关县| 丰镇市| 武穴市| 安国市| 巩义市| 北碚区| 腾冲县| 花莲市| 永川市| 新泰市| 崇明县| 句容市| 军事| 庐江县| 阿拉善左旗| 方山县| 黔东| 洪洞县| 景宁| 柘荣县|