先说下大背景--用户数据交互数据业务数据都在同一个数据库上,当有时效的活动比如榜单结束的时候大量用户开始刷排名,导致数据库读写同步压力过大,数据延迟从而产生错误的排名;
当时对大数据表已经做了分表处理而且加了缓存,千人榜乃至万人榜的榜单结束是伴随着大量的计算,数据插入,消息推送;mysql IO瞬间就飙到60M;所以在不改变线上系统稳定运行的前提下把用户交互数据移出去。
springboot双数据库的例子网上有很多,但是不同的场景就有不同的处理方式。
直接上干货:
双数据源配置主要以下几个类:
/**
* Created by lixb on 2018/1/27.
* 多数据源数据库类型
* app基本库
* 社交库
* 消息库 等
*/
public enum DataSourceType {
db_app, //默认app
ab_msg //社交库
}
/**
* Created by lixb on 2018/1/26.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.METHOD
})
public @interface DS {
DataSourceType value() default DataSourceType.db_app;
}
/**
* Created by lixb on 2018/1/26.
*/
public class DatabaseContextHolder {
private static final ThreadLocal<DataSourceType> contextHolder = new ThreadLocal<>();
// 设置数据源名
public static void setDB(DataSourceType dbType) {
contextHolder.set(dbType);
}
// 获取数据源名
public static DataSourceType getDB() {
return (contextHolder.get());
}
// 清除数据源名
public static void clearDB() {
contextHolder.remove();
}
}
/**
* Created by lixb on 2018/1/26.
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DatabaseContextHolder.getDB();
}
}
/** 切面控制切换数据源
* Created by lixb