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

深入探討Druid動態(tài)數據源的實現方式

 更新時間:2023年08月13日 15:18:38   作者:vker  
Druid是一個高性能的實時分析數據庫,它可以處理大規(guī)模數據集的快速查詢和聚合操作,在Druid中,動態(tài)數據源是一種可以在運行時動態(tài)添加和刪除的數據源,使用動態(tài)數據源,您可以在Druid中輕松地處理不斷變化的數據集,本文講給大家介紹一下Druid動態(tài)數據源該如何實現

一、應用場景

  • 主從復制
  • 讀寫分離
  • 分庫分表

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

二、實現方式

1、技術棧

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

2、Maven 依賴

下邊依賴放入同一個 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、數據庫結構

數據庫結構非常簡單,主要實現思想,復雜的都是同一個操作方式。

image.png

(1)數據庫: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)數據庫: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、定義一個 DataSources 注解

這個注解主要用于多數據源的選擇,默認是 master

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

6、配置一下動態(tài)數據源

這個類主要用于配置多數據源,不要忘記 @Primary 注解,否則會報錯。

@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、寫一個基于 DataSources 注解的動態(tài)代理

這個動態(tài)代理用于檢查類或者方法上的 @DataSources 注解,取到注解中的 value 值,將值傳入動態(tài)數據源配置類 DynamicDataSources ThreadLocal 中,用于選擇數據源。

@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("進入AOP代理: {}", value);
    }
}

8、再來寫一個讀數據庫配置信息的配置類

這個配置類主要將 application.yml 中的數據庫配置信息的配置信息進行加載,然后使用數據源事務管理器 DataSourceTransactionManager 進行注冊。

@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;
    }
}

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

1、實體類

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

2、Dao 數據層

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 服務層

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 控制層

這里說一下,你可以將注解 @DataSources 注解放到你想使用不同數據源的方法上,如下,默認 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、最后來看一下啟動類

需要把 DataSourceAutoConfiguration 排除掉哦

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

6、測試結果

list1接口

image.png

list2接口

image.png

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

以上就是深入探討Druid動態(tài)數據源的實現方式的詳細內容,更多關于Druid動態(tài)數據源的資料請關注腳本之家其它相關文章!

相關文章

  • java面向對象:API(接口)與集合(ArrayList)

    java面向對象:API(接口)與集合(ArrayList)

    這篇文章主要介紹了Java語言面向對象的API與集合,還是十分不錯的,這里給大家分享下,需要的朋友可以參考,希望能夠給你帶來幫助
    2021-08-08
  • Java Object類方法原理和使用場景

    Java Object類方法原理和使用場景

    本文詳細介紹了Java中Object類的幾個重要方法,包括clone()、getClass()、toString()、finalize()、equals()和hashCode(),以及wait()、notify()、notifyAll(),每個方法的使用場景、特點和最佳實踐都被逐一解釋,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • spring mvc中的@PathVariable動態(tài)參數詳解

    spring mvc中的@PathVariable動態(tài)參數詳解

    這篇文章主要介紹了spring mvc中的@PathVariable動態(tài)參數詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java基礎中異常及包歸納整理

    java基礎中異常及包歸納整理

    這篇文章主要介紹了java基礎中的 異常與包,有需要的朋友可以參考一下
    2017-04-04
  • 本地使用Docker部署Java服務的詳細步驟

    本地使用Docker部署Java服務的詳細步驟

    在本地使用 Docker 部署 Java 服務是一個常見的做法,可以幫助開發(fā)者在本地環(huán)境中快速搭建、測試和調試 Java 應用程序,以下是詳細的步驟指南,幫助你在本地計算機上使用 Docker 部署 Java 服務,需要的朋友可以參考下
    2025-10-10
  • java并發(fā)編程之原子性、可見性、有序性

    java并發(fā)編程之原子性、可見性、有序性

    這篇文章主要給大家分享的是java并發(fā)編程的原子性、可見性和有序性,文章會具體舉例說明,感興趣的小伙伴可以參考一下文章的具體內容
    2021-09-09
  • 一文詳解JavaWeb過濾器(Filter)

    一文詳解JavaWeb過濾器(Filter)

    本文主要介紹了一文詳解JavaWeb過濾器(Filter),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • Java實現五子棋游戲

    Java實現五子棋游戲

    這篇文章主要為大家詳細介紹了Java實現五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • maven插件maven-assembly-plugin打包歸納文件zip/tar使用

    maven插件maven-assembly-plugin打包歸納文件zip/tar使用

    java項目運行的文件需要jar或者war格式,同時還需要使用Java命令,本文主要介紹了maven插件maven-assembly-plugin打包歸納文件zip/tar使用,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • JAVA實現往字符串中某位置加入一個字符串

    JAVA實現往字符串中某位置加入一個字符串

    這篇文章主要介紹了JAVA實現往字符串中某位置加入一個字符串,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08

最新評論

峨边| 西峡县| 微博| 太仓市| 喜德县| 锡林浩特市| 昌乐县| 凤山市| 樟树市| 成武县| 弥渡县| 金昌市| 新营市| 十堰市| 财经| 娄烦县| 临海市| 远安县| 卓资县| 濮阳县| 新野县| 赤城县| 建瓯市| 上杭县| 沭阳县| 南岸区| 灵宝市| 双峰县| 白城市| 莫力| 西昌市| 盐边县| 宽城| 东阳市| 孝昌县| 绥中县| 合作市| 上栗县| 南郑县| 衡山县| 汤阴县|