当前位置: 首页 > news >正文

如何做网站的外链六安马启兵

如何做网站的外链,六安马启兵,嘉兴网络建站模板,wordpress博客页面修改场景描述#xff1a; 前一阵子接手的新项目中需要使用2个数据源。 一个叫行云数据库#xff0c;一个叫OceanBase数据库。 就是说#xff0c;我有时候查询要查行云的数据#xff0c;有时候查询要查 OceanBase 的数据#xff0c;咋办#xff1f; 废话不多说#xff0c…场景描述 前一阵子接手的新项目中需要使用2个数据源。 一个叫行云数据库一个叫OceanBase数据库。 就是说我有时候查询要查行云的数据有时候查询要查 OceanBase 的数据咋办 废话不多说 下面以mysql为例开整。 一、环境依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope /dependency dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.3.0/version /dependency dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.28/version /dependency二、实现思路 在进行下一步之前我们必须要知道 SpringBoot 自动配置的相关原理因为之前我们大多是单数据源。 # 配置mysql数据库 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/blog?serverTimezoneAsia/ShanghaiallowMultiQueriestrueusername: rootpassword: root从前只是会用会配置甚至都是别人给配置的自己直接拿来用。 但是要搞懂动态数据源就必须要先搞懂自动配置。 0.o?让我看看怎么个事儿之SpringBoot自动配置 现在我们要实现多数据源并且可以自动切换。 也就是我 A 查询连接的是行云数据库。 而我 B 查询却连接的是 OceanBase 数据库。 怎么办 那第一个肯定就不能再使用DataSourceAutoConfigurtation了。 我直接反手一个 exclude 。 EnableAutoConfiguration(exclude {DataSourceAutoConfiguration.class})然后呢 Spring boot想得很周到它提供了AbstractRoutingDataSource 抽象类。 这个类能根据用户定义的规则选择当前的数据源。 有同学要问了 AbstractRoutingDataSource 是什么东西 AbstractRoutingDataSource 是一个抽象类。 它继承了 AbstractDataSource 抽象类。 而 AbstractDataSource 实现了 DataSource 接口。 也就是说AbstractRoutingDataSource 他实际上就是一个DataSource 。 AbstractRoutingDataSource 中有两个关键方法。 setTargetDataSources(MapObject, Object targetDataSources)第一个方法见名知意设置目标数据源复数也就是多个。 protected abstract Object determineCurrentLookupKey();第二个方法是仅有的一个抽象方法需要开发者具体实现也可以见名知意决定当前使用目标数据源中的哪个。 我们要做的是什么 我们准备 2 个数据源全部配置好放进 MapObject, Object targetDataSources 里备用。 我们继承 AbstractRoutingDataSource 并实现抽象方法 determineCurrentLookupKey() 。 当我们继承AbstractRoutingDataSource时我们自身也是一个数据源。 对于数据源必然有连接数据库的动作。 只是AbstractRoutingDataSource的getConnection()方法里实际是调用determineTargetDataSource()返回的数据源的getConnection()方法。 这样我们可以在执行查询之前设置使用的数据源。 实现可动态路由的数据源在每次数据库查询操作前执行。 它的抽象方法 determineCurrentLookupKey() 决定使用哪个数据源。 我知道肯定有人看不懂要上嘴脸了 Talk is cheap, show me the FUCKING code !!! 2.1 配置文件 spring:datasource:dynamic:db1:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db1?serverTimezoneAsia/ShanghaiallowMultiQueriestrueusername: rootpassword: rootdb2:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db2?serverTimezoneAsia/ShanghaiallowMultiQueriestrueusername: rootpassword: root2.2 自定义动态数据源 DynamicDataSource继承AbstractRoutingDataSource。 public class DynamicDataSource extends AbstractRoutingDataSource {Overrideprotected Object determineCurrentLookupKey() {return DynamicDataSourceContextHolder.getDataSource();} }这里的determineCurrentLookupKey方法需要返回一个数据源。 又有同学问了 DynamicDataSourceContextHolder 又是什么东西 public class DynamicDataSourceContextHolder {public static final ThreadLocalString CONTEXT_HOLDER new ThreadLocal();public static String getDataSource() {return CONTEXT_HOLDER.get();}public static void setDataSource(String dataSource) {CONTEXT_HOLDER.set(dataSource);}public static void clearDataSource() {CONTEXT_HOLDER.remove();} }看到 Context 应该很熟悉了跟程序上下文有关。 它的作用就是你查询数据库的时候用哪个数据源就 setDataSource 哪个。 还有点懵没事继续往下看。 Configuration EnableAutoConfiguration(exclude {DataSourceAutoConfiguration.class}) public class DynamicDataSourceConfig {Bean(db1)ConfigurationProperties(prefix spring.datasource.dynamic.db1)public DataSource db1() {return DataSourceBuilder.create().build();}Bean(db2)ConfigurationProperties(prefix spring.datasource.dynamic.db2)public DataSource db2() {return DataSourceBuilder.create().build();}BeanPrimarypublic DataSource dataSource() {MapObject, Object dataSourceMap new HashMap(2);dataSourceMap.put(db1, db1());dataSourceMap.put(db2, db2());DynamicDataSource dynamicDataSource new DynamicDataSource();// 需要设置的多数据源dynamicDataSource.setTargetDataSources(dataSourceMap);// 主数据源/默认数据源dynamicDataSource.setDefaultTargetDataSource(db1());return dynamicDataSource;} }这是比较常见的自定义数据源配置了。 可以看到一共注册了3个数据源。 但是最后一个DynamicDataSource有 Primary 注解它表明这个数据源优先级更高。 DynamicDataSource中设置了dataSourceMap也就是保存了 db1 和 db2。 以上我们动态数据源配置的工作就做完了。 我们以实际查询中的操作完整捋一遍这当中到底发生了什么 Service public class UserService {Autowiredprivate UserMapper userMapper;/***使用db2数据源*/public void saveUser(UserDto userDto) {DynamicDatasourceHolder.setDataSource(db2);User user new User();user.setUName(userDto.getName());userMapper.insert(user);DynamicDatasourceHolder.removeDataSource(db2);} }首先DynamicDatasourceHolder 设置了数据源 db2 。 CONTEXT_HOLDER 中就保存了一个 “db2” 字符串。 userMapper 进行数据库操作之前MyBatis 框架替我们做了一些事。 其中一件事是获取数据库连接。 MyBatis 就在想我得找个 DataSource 因为DataSource 有getConnection() 方法。 谁是 DataSource 继承了 AbstractRoutingDataSource 的 DynamicDataSource 大声喊到我是 开始连接数据库 Override public Connection getConnection() throws SQLException {return determineTargetDataSource().getConnection(); }连接哪个 protected DataSource determineTargetDataSource() {// 哥看这一行Object lookupKey determineCurrentLookupKey();DataSource dataSource this.resolvedDataSources.get(lookupKey);return dataSource; }连接这个 Override protected Object determineCurrentLookupKey() {return DynamicDataSourceContextHolder.getDataSource(); }连接完成 insert 完成 removeDataSource(“db2”) 每次这样用嫌麻烦 办他 三、动态数据源注解DS 看这部分之前需要一些前置知识点 Java注解看完就会用 师爷翻译翻译什么叫AOP Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Component public interface DS {String value() default db1; }Component Aspect public class DynamicDataSourceAspect {Pointcut(annotation(com.example.demo.annotation.DS))public void dynamicDataSourcePointCut() {}Around(dynamicDataSourcePointCut())public Object around(ProceedingJoinPoint joinPoint) throws Throwable {String dataSourceKey db1;// 类上的注解Class? aClass joinPoint.getTarget().getClass();DS annotation aClass.getAnnotation(DS.class);// 方法上的注解MethodSignature signature (MethodSignature) joinPoint.getSignature();DS annotationMethod signature.getMethod().getAnnotation(DS.class);if (Objects.nonNull(annotationMethod)) {dataSourceKey annotationMethod.value();} else {dataSourceKey annotation.value();}// 设置数据源DynamicDataSourceContextHolder.setDataSource(dataSourceKey);try {return joinPoint.proceed();}finally {DynamicDataSourceContextHolder.clearDataSource();}} }具体我就不讲解了自己对照前两篇文章研究一下吧。 最后再补充一下动态数据源实际上有现成的依赖包可以用可以参考使用地址如下 https://github.com/baomidou/dynamic-datasource 往期推荐 ● 师爷翻译翻译什么叫AOP ● 0.o?让我看看怎么个事儿之SpringBoot自动配置 ● 终于搞懂动态代理了 ● 学会ConfigurationProperties月薪过三千 ● 不是银趴~是Import ● ConditionalConfiguration有没有搞头
http://www.zqtcl.cn/news/552247/

相关文章:

  • 模板网站建设清单太原网站制作电话
  • 网站建设的需求要素设计企业网站机
  • 深圳百度推广电话西安官网seo技术
  • 沈阳建站免费模板福州建设企业
  • 怎么在百度首页做网站wordpress返回前页
  • 张家口城乡建设局网站wordpress 等待响应
  • 专门设计网站的公司叫什么怎么做网站多少钱
  • 淡水网站建设健身器材 网站模版
  • 河南建设网站公司简介做新闻类网站需要什么资质
  • 网络文化经营许可证图片下载优化大师安装桌面
  • 网站cms系统教育网站开发文档
  • 用网站做淘客怎么做网站建设在电访销售话术
  • 做电影网站赚了几百万动画制作流程
  • 怎么做企业的网站首页wordpress 主机迁移
  • 网站常见问题网页设计代码开头
  • 聊城网站推广品牌推广计划描述
  • 池州网站制作优化有没有专业做特产的网站
  • wordpress采集站源码wordpress好用的会员插件
  • 寿县城乡建设局网站青岛网站建设大全
  • 杭州做网站的好公司哪家好做影视网站侵权吗
  • 自助建站网站seo公司想学编程做网站
  • 网站空间备案要多久花木公司网站源码
  • 高端求职网站排名ftontpage如何做网站
  • 音乐网站开发技术河南省住房和城乡建设门户网站
  • 吉安微信网站弋阳县建设工程网站
  • 网站建设自学建站视频教程哈尔滨全国网站建设
  • 网站建设基础培训网站架构拓扑图
  • 网站开发价格预算成都必去的地方排行榜
  • 鹤岗做网站企业建立网站主要包括那些流程
  • 如何进网站出口外贸是做什么的