Springboot中使用Mysql多数据源
随着业务的发展,很可能需要在一个项目里面同时使用多个数据源。
大致看了网上的多数据源Demo,发现无非有两种:
一种是自己封装多个
JdbcTemplate
,然后调用对应的数据库就使用对应的JdbcTemplate
一种是通过注解的方式来实现,在需要切换数据源的方法上添加一个自己封装的注解便可以完成切换。
考虑了一下以后的扩展性和通用性,便决定采用基于注解的多数据源方式
随着业务的发展,很可能需要在一个项目里面同时使用多个数据源。
大致看了网上的多数据源Demo,发现无非有两种:
一种是自己封装多个
JdbcTemplate
,然后调用对应的数据库就使用对应的JdbcTemplate
一种是通过注解的方式来实现,在需要切换数据源的方法上添加一个自己封装的注解便可以完成切换。
考虑了一下以后的扩展性和通用性,便决定采用基于注解的多数据源方式
使用过Java多线程的都知道,volatile
可以确保多线程永远都可以读取到最新的变量。但是却无法保证一个操作的原子性
关于这部分可以先从硬件部分说起:
在现代计算机中,CPU的速度是远远快于内存的,如果不加以任何处理,此时CPU就会一直在等待内存的IO,从而导致一些资源的浪费。所以就有了高速缓冲区(cache),但是在Cache里面肯定是不会将内存的所有数据都拷贝一份,因为cacahe只有几十kb的大小。
这就造成了一个现象,也就是说每一个核心都会有一个共享的内存区域和一个自己Cache区域。
具体表现为数据被update之后,在同一个事物里面再次查询,查询的是一个更新之后的值。
更新一个商品的信息,其步骤如下:
记录变更之前的值,变更之后的值
)配置nginx的https,但是修改配置文件之后一直无法访问。。。
刚开始以为是防火墙的原因,由于是阿里云的主机,所以直接登录云主机查看安全配置。一切都是OK的。
然后又查看主机自己的防火墙,由于是centos7
,所以在此花了点时间,最后还是将443端口添加到了防火墙规则中,然后重启防火墙。。。
随着第一个项目正式上线,是时候总结点什么了。以供自己日后反思。
顺便也提醒下自己是时候看下《代码整洁之道》
了
在代码里面最好不要有魔法值
,这个虽然在阿里巴巴开发手册中提到过,但是自己刚开始的时候一直觉得,有时候这个变量就使用一次,为啥还需要定义一个变量,那样到时候去寻找这个变量的时候不是更加麻烦么。
后来才发现这个想法有点愚蠢,因为你根本不知道后来会不会使用这个变量。例如以下代码:
在开发的过程中,不可避免的会使用多数据源,但是相对于Mysql的多数据源,Mongo的多数据源配置还是比较容易的。
首先在pom.xml
中引入mongo
的驱动jar包以及springboot
和mongo
的一个jar包
Mongo的多数据源无非是首先读取配置文件,生成MongoProperties
,通过MongoProperties
来生成一个MongoTemplate
,最后通过Repository
来操作Mongo。
假设有一个如下的业务场景如下:
需要记录一个商品或者股票的实时价格,每一个小时记录一次,而商品或者股票的数量十分多,这时业务发展到一定的程度之后就需要考虑数据库的设计。首先商品每个小时的价格肯定是需要入库的。其次每小时的购买人群以及各种埋点数据随之一起也要入库。以便于日后的数据分析。
随着数据量的增大,一般的解决方案是设置索引,然后再考虑是进行垂直还是水平分库分表。
但是一旦使用水平分库分表就会无形之间增加开发的复杂程度,而且分库分表之后考虑的各种因素也会随之而来增加数倍。例如各种表的唯一ID
以及如何进行维度的划分。
当消费段接收到一个消息之后,会进行消费的处理。假如在业务中发现该消息是一个错误的消息,那么很显然业务方会直接拒绝此条消息。
拒绝消息一般在消费端调用reject
或者neck
,这两个Api的作用分别是:一个可以批量消息,一个则只是每一次处理一条
rabbitmq是目前使用最多的一个消息中间件,配合微服务的使用可以使业务模块化,便于之后的维护。同时使用rabbitmq可以将许多业务异步化,提高系统的性能。
但是在使用rabbitmq 的时候需要注意点就是到底是生产者
来建立队列和交换机还是由消费者
来建立交换机和队列。一般的情况是由消费者来建立队列,但是假如消费者挂掉了,导致生产者发出的消息被交换机路由到了一个不存在的队列,那么此时 rabbitmq会忽略该条消息。所以对于重要的消息。即不允许该消息丢失,那么此时最好是由生产者和消费者一起船创建一个队列。
今天在配置Vue的路由的时候,在router的index.js
中配置了如下代码:
1 | import Vue from 'vue' |
但是却在启动项目的时候,输入URL:localhost:8080/tree
无法实现跳转,后来发现是在App.vue
中没有设置<router-view>
,最后加上去即可。
例如在App.vue
中配置了一个<router-view>
,输入URL:localhost:8080/tree
就会跳转到了Tree.vue
。
那假设在Tree.vue
中再配置配置一个<router-view>
,这时候就会匹配的是localhost:8080/tree/XXX
,当然也可以直接用<router-link>
跳转到指定的组件中