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

SpringBoot中動(dòng)態(tài)數(shù)據(jù)源是實(shí)現(xiàn)與用途

 更新時(shí)間:2023年08月13日 08:35:44   作者:vker  
這篇文章主要是來(lái)和大家討論一下SpringBoot中動(dòng)態(tài)數(shù)據(jù)源是實(shí)現(xiàn)與用途,文中的示例代碼簡(jiǎn)潔易懂,具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下

一、應(yīng)用場(chǎng)景

  • 主從復(fù)制
  • 讀寫分離
  • 分庫(kù)分表

主從復(fù)制與讀寫分離通常是一起使用的。

二、實(shí)現(xiàn)方式

1、技術(shù)棧

  • SpringBoot 2.6.13
  • Druid 1.2.16
  • Spring JDBC
  • MySQL 8.0
  • AOP動(dòng)態(tài)代理

2、Maven 依賴

下邊依賴放入同一個(gè)pom.xml文件就可以

<properties>
    <java.version>11</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>2.6.13</spring-boot.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.16</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3、數(shù)據(jù)庫(kù)結(jié)構(gòu)

數(shù)據(jù)庫(kù)結(jié)構(gòu)非常簡(jiǎn)單,主要實(shí)現(xiàn)思想,復(fù)雜的都是同一個(gè)操作方式。

(1)數(shù)據(jù)庫(kù):db_dynamic1

DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
BEGIN;
INSERT INTO `tb_user` (`id`, `username`) VALUES (1, '張三');
INSERT INTO `tb_user` (`id`, `username`) VALUES (2, '李四');
INSERT INTO `tb_user` (`id`, `username`) VALUES (3, '王五');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;

(2)數(shù)據(jù)庫(kù):db_dynamic2

DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
BEGIN;
INSERT INTO `tb_user` (`id`, `username`) VALUES (1, 'Vker');
INSERT INTO `tb_user` (`id`, `username`) VALUES (2, 'Jack');
INSERT INTO `tb_user` (`id`, `username`) VALUES (3, 'Lucy');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;

4、application.yml 配置文件

將下面配置文件的url, username, password換成你自己的

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

5、定義一個(gè) DataSources 注解

這個(gè)注解主要用于多數(shù)據(jù)源的選擇,默認(rèn)是 master

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSources {
    String value() default "master";
}

6、配置一下動(dòng)態(tài)數(shù)據(jù)源

這個(gè)類主要用于配置多數(shù)據(jù)源,不要忘記@Primary注解,否則會(huì)報(bào)錯(cuò)。

@Component
@Primary
public class DynamicDataSources extends AbstractRoutingDataSource {
    public static ThreadLocal<String> name = new ThreadLocal<>();
    @Resource
    DataSource master;
    @Resource
    DataSource slave;
    @Override
    protected Object determineCurrentLookupKey() {
        return name.get();
    }
    @Override
    public void afterPropertiesSet() {
        Map<Object, Object> ds = new HashMap<>();
        ds.put("master", master);
        ds.put("slave", slave);
        super.setTargetDataSources(ds);
        super.setDefaultTargetDataSource(master);
        super.afterPropertiesSet();
    }
}

7、寫一個(gè)基于 DataSources 注解的動(dòng)態(tài)代理

這個(gè)動(dòng)態(tài)代理用于檢查類或者方法上的@DataSources注解,取到注解中的value值,將值傳入動(dòng)態(tài)數(shù)據(jù)源配置類DynamicDataSourcesThreadLocal中,用于選擇數(shù)據(jù)源。

@Component
@Aspect
public class DynamicDataSourcesAspect {
    Logger logger = LoggerFactory.getLogger(DynamicDataSourcesAspect.class);
    @Before("@annotation(dataSources)")
    public void before(DataSources dataSources) {
        String value = dataSources.value();
        DynamicDataSources.name.set(value);
        logger.info("進(jìn)入AOP代理: {}", value);
    }
}

8、再來(lái)寫一個(gè)讀數(shù)據(jù)庫(kù)配置信息的配置類

這個(gè)配置類主要將application.yml中的數(shù)據(jù)庫(kù)配置信息的配置信息進(jìn)行加載,然后使用數(shù)據(jù)源事務(wù)管理器DataSourceTransactionManager進(jìn)行注冊(cè)。

@Configuration
public class DynamicDataSourcesConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.druid.master")
    public DataSource master() {
        return DruidDataSourceBuilder.create().build();
    }
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.druid.slave")
    public DataSource slave() {
        return DruidDataSourceBuilder.create().build();
    }
    @Bean
    public DataSourceTransactionManager dataSourceTransactionManager1(@Qualifier("master") DataSource master) {
        DataSourceTransactionManager dataSourceTransactionManager =
                new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(master);
        return dataSourceTransactionManager;
    }
    @Bean
    public DataSourceTransactionManager dataSourceTransactionManager2(@Qualifier("slave") DataSource slave) {
        DataSourceTransactionManager dataSourceTransactionManager =
                new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(slave);
        return dataSourceTransactionManager;
    }
}

重點(diǎn)的都做完了,接下來(lái)就寫一下基本的業(yè)務(wù)層代碼吧,注釋就不寫了,我相信小伙伴們都能看懂。

業(yè)務(wù)層代碼

1、實(shí)體類

public class User {
    private Long id;
    private String username;
   // 省略了 getter setter
}

2、Dao 數(shù)據(jù)層

public interface UserMapper {
    List<User> selectAllUser();
}
@Repository
public class UserMapperImpl implements UserMapper {
    @Resource
    private JdbcTemplate jdbcTemplate;
    @Override
    public List<User> selectAllUser() {
        String sql = "select * from tb_user";
        return jdbcTemplate.query(sql,
                new BeanPropertyRowMapper<>(User.class));
    }
}

3、Service 服務(wù)層

public interface UserService {
    List<User> list();
}
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
    @Override
    public List<User> list() {
        return userMapper.selectAllUser();
    }
}

4、Controller 控制層

這里說(shuō)一下,你可以將注解 @DataSources 注解放到你想使用不同數(shù)據(jù)源的方法上,如下,默認(rèn) master 可以不寫。

@RestController
public class UserController {
    @Resource
    private UserService userService;
    @GetMapping("list1")
    public List<User> list1() {
        return userService.list();
    }
    @GetMapping("list2")
    @DataSources("slave")
    public List<User> lis2t() {
        return userService.list();
    }
}

5、最后來(lái)看一下啟動(dòng)類

需要把 DataSourceAutoConfiguration 排除掉哦

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

6、測(cè)試結(jié)果

list1接口

list2接口

好了,以上就是動(dòng)態(tài)數(shù)據(jù)源的實(shí)現(xiàn)方式了,歡迎小伙伴們留言,下期我們看看,如何實(shí)現(xiàn)主從復(fù)制和讀寫分離。

以上就是SpringBoot中動(dòng)態(tài)數(shù)據(jù)源是實(shí)現(xiàn)與用途的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot動(dòng)態(tài)數(shù)據(jù)源的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Eclipse+Java+Swing實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)的實(shí)例代碼

    Eclipse+Java+Swing實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)的實(shí)例代碼

    這篇文章主要介紹了Eclipse+Java+Swing實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 帶大家深入了解Spring事務(wù)

    帶大家深入了解Spring事務(wù)

    Spring框架提供統(tǒng)一的事務(wù)抽象,通過(guò)統(tǒng)一的編程模型使得應(yīng)用程序可以很容易地在不同的事務(wù)框架之間進(jìn)行切換. 在學(xué)習(xí)Spring事務(wù)前,我們先對(duì)數(shù)據(jù)庫(kù)事務(wù)進(jìn)行簡(jiǎn)單的介紹。,需要的朋友可以參考下
    2021-05-05
  • Java實(shí)現(xiàn)將PDF轉(zhuǎn)為PDF/A

    Java實(shí)現(xiàn)將PDF轉(zhuǎn)為PDF/A

    通過(guò)將PDF格式轉(zhuǎn)換為PDF/A格式,可保護(hù)文檔布局、格式、字體、大小等不受更改,從而實(shí)現(xiàn)文檔安全保護(hù)的目的,同時(shí)又能保證文檔可讀、可訪問(wèn)。本文將為大家介紹如何實(shí)現(xiàn)這一轉(zhuǎn)換,需要的可以參考一下
    2022-01-01
  • java解決動(dòng)態(tài)配置字段需求問(wèn)題

    java解決動(dòng)態(tài)配置字段需求問(wèn)題

    這篇文章主要介紹了java解決動(dòng)態(tài)配置字段需求問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Mac OS上安裝Tomcat服務(wù)器的簡(jiǎn)單步驟

    Mac OS上安裝Tomcat服務(wù)器的簡(jiǎn)單步驟

    這篇文章主要介紹了Mac OS上安裝Tomcat服務(wù)器的簡(jiǎn)單步驟,包括簡(jiǎn)單的啟動(dòng)命令和查看Tomcat信息的方法,需要的朋友可以參考下
    2015-11-11
  • SpringCache緩存抽象之CacheManager與自定義鍵生成方式

    SpringCache緩存抽象之CacheManager與自定義鍵生成方式

    本文將深入探討Spring Cache的核心組件CacheManager及自定義鍵生成策略,幫助開發(fā)者掌握緩存配置與優(yōu)化技巧,從而構(gòu)建高效可靠的緩存系統(tǒng),希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • spring?boot項(xiàng)目實(shí)戰(zhàn)之實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的連接

    spring?boot項(xiàng)目實(shí)戰(zhàn)之實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的連接

    在我們?nèi)粘5拈_發(fā)過(guò)程中,肯定不可避免的會(huì)使用到數(shù)據(jù)庫(kù)以及SQL?語(yǔ)句,下面這篇文章主要給大家介紹了關(guān)于spring?boot項(xiàng)目實(shí)戰(zhàn)之實(shí)現(xiàn)與數(shù)據(jù)庫(kù)連接的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 淺談java socket的正確關(guān)閉姿勢(shì)

    淺談java socket的正確關(guān)閉姿勢(shì)

    這篇文章主要介紹了java socket的正確關(guān)閉姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Mybatis的Dao層實(shí)現(xiàn)原理分析

    Mybatis的Dao層實(shí)現(xiàn)原理分析

    這篇文章主要介紹了Mybatis的Dao層實(shí)現(xiàn)原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java中的MessageFormat.format用法實(shí)例

    Java中的MessageFormat.format用法實(shí)例

    這篇文章主要介紹了Java中的MessageFormat.format用法實(shí)例,本文先是講解了MessageFormat的語(yǔ)法,然后給出了多個(gè)操作實(shí)例,需要的朋友可以參考下
    2015-06-06

最新評(píng)論

连南| 宝山区| 铜鼓县| 女性| 中卫市| 灵丘县| 镇远县| 靖远县| 杨浦区| 西和县| 瓮安县| 文登市| 金门县| 南康市| 岱山县| 土默特右旗| 福清市| 凤台县| 伊春市| 普安县| 石首市| 新乡市| 泰和县| 尼玛县| 旺苍县| 中卫市| 九台市| 汕头市| 大安市| 黄龙县| 长沙市| 乌兰察布市| 甘谷县| 乌兰浩特市| 津市市| 邯郸县| 阿荣旗| 临安市| 上犹县| 安仁县| 灵武市|