自定义多数据源

多数据源

第一章 自定义多数据源


文章目录

  • 多数据源
  • 前言
  • 一、先在配置文件中配置好多个数据源
  • 二、配置数据源的配置文件
  • 三、定义动态数据源配置
    • 1、自定义了Datasource,主要目的是为了在Spring容器中定义一个datasource的Bean,用于mybtais获取数据库连接使用。 2、为jdbc获取数据连接 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b84024bd2cf842e0b36bd4a29784c32a.png)
  • 四、自定义注解,用来判断curd,按照不同的操作类型进行区分
  • 总结


前言

本案例是使用spring-boot+mysql 来作为案例,需要先搭建好服务。


一、先在配置文件中配置好多个数据源

具体配置示例:

server:port: 8080
spring:datasource:datasource1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.180.129:13306/test1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTCusername: rootpassword: 123456hikari:minimum-idle: 5idle-timeout: 600000maximum-pool-size: 10auto-commit: truepool-name: MyHikariCPmax-lifetime: 1800000connection-timeout: 30000connection-test-query: SELECT 1datasource2:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.180.129:13306/test2?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTCusername: rootpassword: 123456hikari:minimum-idle: 5idle-timeout: 600000maximum-pool-size: 10auto-commit: truepool-name: MyHikariCPmax-lifetime: 1800000connection-timeout: 30000connection-test-query: SELECT 1

配置了两个数据源,datasource1和datasource2,分别用来表示写与读的数据源

二、配置数据源的配置文件

具体代码示例:

@Configuration
public class DataSourceConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource1")DataSource dataSource1() {return DruidDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource2")DataSource dataSource2() {return DruidDataSourceBuilder.create().build();}
}

1、分别为spring容器定义了两个datasource,同时限定了不同的数据源读取不同的配置
2、具体的限定条件为spring.datasource.datasourcexxxx。

三、定义动态数据源配置

具体代码示例:

@Component
@Primary
public class DynamicDataSource implements DataSource {public static ThreadLocal<OperationTypeEnum> operationType = ThreadLocal.withInitial(() -> OperationTypeEnum.WRITE);@Autowiredprivate DataSource dataSource1;@Autowiredprivate DataSource dataSource2;@Overridepublic Connection getConnection() throws SQLException {OperationTypeEnum operationTypeEnum = operationType.get();switch (operationTypeEnum) {case READ:return dataSource2.getConnection();case WRITE:case DELETE:case UPDATE:return dataSource1.getConnection();}return dataSource1.getConnection();}@Overridepublic Connection getConnection(String username, String password) throws SQLException {OperationTypeEnum operationTypeEnum = operationType.get();switch (operationTypeEnum) {case READ:return dataSource2.getConnection(username, password);case WRITE:case DELETE:case UPDATE:return dataSource1.getConnection(username, password);}return dataSource1.getConnection(username, password);}@Overridepublic <T> T unwrap(Class<T> iface) throws SQLException {return null;}@Overridepublic boolean isWrapperFor(Class<?> iface) throws SQLException {return false;}@Overridepublic PrintWriter getLogWriter() throws SQLException {return null;}@Overridepublic void setLogWriter(PrintWriter out) throws SQLException {}@Overridepublic void setLoginTimeout(int seconds) throws SQLException {}@Overridepublic int getLoginTimeout() throws SQLException {return 0;}@Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {return null;}
}

1、自定义了Datasource,主要目的是为了在Spring容器中定义一个datasource的Bean,用于mybtais获取数据库连接使用。
2、为jdbc获取数据连接
在这里插入图片描述

四、自定义注解,用来判断curd,按照不同的操作类型进行区分

1、注解的定义

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface JdbcOperationAnnotation {OperationTypeEnum value() default OperationTypeEnum.WRITE;
}

2、操作类型枚举的定义

@Getter
public enum OperationTypeEnum {WRITE(0),READ(1),UPDATE(2),DELETE(3);private Integer code;OperationTypeEnum(Integer code) {this.code = code;}
}

3、切面的定义

@Slf4j
@Aspect
@Component
public class JdbcOperationAspect {@Around("@annotation(jdbcOperationAnnotation)")public Object aroundJdbcOperation(ProceedingJoinPoint joinPoint, JdbcOperationAnnotation jdbcOperationAnnotation) throws Throwable {log.info("读取注解信息: {}"+ JSON.toJSONString(jdbcOperationAnnotation));OperationTypeEnum operationTypeEnum = jdbcOperationAnnotation.value();switch (operationTypeEnum) {case READ:DynamicDataSource.operationType.set(OperationTypeEnum.READ);break;case WRITE:DynamicDataSource.operationType.set(OperationTypeEnum.WRITE);break;case UPDATE:DynamicDataSource.operationType.set(OperationTypeEnum.UPDATE);break;case DELETE:DynamicDataSource.operationType.set(OperationTypeEnum.DELETE);}return joinPoint.proceed();}
}

4、注解的使用

@Mapper
public interface UserMapper {@JdbcOperationAnnotation(OperationTypeEnum.READ)@Select("select * from user where username = #{username}")User selectUser(String username);@JdbcOperationAnnotation(OperationTypeEnum.WRITE)@Insert("insert into user(username, password) values (#{username}, #{password})")void addUser(@Param("username") String username, @Param("password") String password);
}

总结

通过重新实现 DataSource 接口,我们可以掌控数据库连接的创建和管理,确保程序按照我们期望的方式执行。这个自定义的过程让我们能够更好地适应特定的业务需求和性能要求,从而优化数据库操作的执行流程。这种灵活性和控制权是自定义数据源的核心优势,让我们能够更好地满足应用程序的需求,确保其稳定性和高效性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/618459.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全等级保护等级测评方案

软件全套资料包获取进主页。 ‘

DolphinScheduler2.x 伪分布式部署

文章目录 DolphinScheduler2.x 伪分布式部署QA DolphinScheduler2.x 伪分布式部署 DolphinScheduler 部署说明 1 软硬件环境要求 1.1 操作系统版本要求 操作系统版本Red Hat Enterprise Linux7.0 及以上CentOS7.0 及以上Oracle Enterprise Linux7.0 及以上Ubuntu LTS16.04 …

传统图机器学习的特征工程-全图

将整张图表示成为一个低维向量&#xff0c;反映全图的特征 key idea&#xff1a;Bag-of-Words&#xff08;BOW&#xff09;把图看作文章&#xff0c;把节点看作单词 Kernel mothods

实验8 内置对象session

一、实验目的 掌握怎样在JSP中使用内置对象session 二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握session的用法。【参考课本4.6.5 】 三、源代码以及执行结果截图&#xff1a; choiceGrade.jsp <% page language"java" content…

安卓刷机fastboot分段传输

win10 fastboot 无法识别&#xff0c;驱动下载地址GitHub - xushuan/google_latest_usb_driver_windows 把inf文件更新到设备管理器驱动更新即可 问题 archive does not contain super_empty.img Sending vbmeta_a (4 KB) OKAY [ 0.117s] Writing …

伺服驱动器算法入门的一些建议和书籍推荐

希望此篇文章对想从事伺服驱动器的研发工作的一些刚刚入门的同学一些建议。 针对伺服驱动器的研发工作涉及的知识和需要掌握的技能主要分为两部分&#xff0c;第一是原理部分、第二是工程实践部分。原理部分的学习在此主要推荐大家查看一些入门书籍&#xff0c;本文章中也对书籍…

关于项目打包

除了自己常用的那种方式&#xff0c;也可以直接在文件夹下执行命令。 如果当前项目聚合了其他子模块的话&#xff1a; 先清理&#xff0c;再打包&#xff0c;同时跳过测试 如果打包后&#xff0c;然后项执行某个模块&#xff0c;进入当前文件夹下直接java -jar 和jar包名执行就…

微服务之Consul 注册中心介绍以及搭建

一、微服务概述 1.1单体架构 单体架构&#xff08;monolithic structure&#xff09;&#xff1a;顾名思义&#xff0c;整个项目中所有功能模块都在一个工程中开发&#xff1b;项目部署时需要对所有模块一起编译、打包&#xff1b;项目的架构设计、开发模式都非常简单。 当项…

模型训练-保存训练数据

1.目的 找到一个可运行的代码&#xff0c;可以每个epoch打印训练数据&#xff0c;但是不会保存。因为在改进模型需要这些训练数据进行对比&#xff0c;所以需要将每个epoch的训练数据保存下来&#xff0c;写到一个文件中。 2.解决方案1 直接问ChatGPT&#xff0c;提示词如下…

服务器主机关机重启告警

提取时间段内系统操作命名&#xff0c;出现系统重启命令&#xff0c;若要出现及时联系确认 重启命令&#xff1a; reboot / init 6 / shutdown -r now&#xff08;现在重启命令&#xff09; 关机命令&#xff1a; init 0 / shutdown -h now&#xff08;关机&#…

ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token

前言 JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络上以 JSON 对象的形式安全地传输信息。 JWT 通常用于在用户和服务器之间传递身份验证信息&#xff0c;以便在用户进行跨域访问时进行身份验证。 JWT 由…

会声会影2024全新视频剪辑软件

会声会影 (CyberLink PowerDirector) 是一款既强大又易于使用的视频编辑软件&#xff0c;具有众多功能和工具&#xff0c;专为用户设计制作高质量的视频剪辑和制作。无论您是一个新手或是一个有经验的电影制作者&#xff0c;会声会影都适合您的需要。 生活即电影 软件下载地址&…