首页 > 学院 > 开发设计 > 正文

读写分离

2019-11-08 21:00:13
字体:
来源:转载
供稿:网友

要求几秒钟之内有写请求,哪怕配置读数据库,也要使用master数据库

可以借助sPRing 的AbstractRoutingDataSource主要实现determineTargetDataSource抽象方法,去获取对应的datasource

public class DynamicDataSource extends AbstractRoutingDataSource {    public static final String DEFAULT_DATA_SOURCE = "defaultDataSource";    public static final List<String> dataSourceNames = new ArrayList<String>();    @Override    protected Object determineCurrentLookupKey() {        return DataSourceContextHolder.getDataSourceName();    }    public void setTargetDataSources(Map<Object, Object> targetDataSources) {        if (targetDataSources != null) {            Iterator iterator = targetDataSources.keySet().iterator();            while (iterator.hasNext()) {                String name = (String) iterator.next();                if (!DynamicDataSource.DEFAULT_DATA_SOURCE.equals(name)) {                    dataSourceNames.add(name);                }            }        }        super.setTargetDataSources(targetDataSources);    }
public class DataSourceContextHolder {    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();    /**     *     * @param dataSourceName     */    public static void setDataSourceName(String dataSourceName) {        contextHolder.set(dataSourceName);    }    public static String getDataSourceName() {        return contextHolder.get();    }    /**     * 清除只读数据源     */    public static void clearDataSource() {        contextHolder.remove();    }    /**     * 设置为只读数据源     */    public static void readDataSource() {        readDataSource(new PollingDataSourceAdapter());    }    public static void readDataSource(DataSourceAdapter adapter){        setDataSourceName(adapter.calculate(DynamicDataSource.dataSourceNames));    }    /**     * 设置为只读数据源     */    public static void defaultDataSource() {        setDataSourceName(DynamicDataSource.DEFAULT_DATA_SOURCE);    }}

aspect

 public Object switchReadOnlyDataSource(ProceedingJoinPoint joinPoint) throws Throwable {              Object result = null;        try {            if (dataSourceHoldEnabled && DataSourceContextHolder.getDataSourceName() == null) {                MethodSignature signature = (MethodSignature) joinPoint.getSignature();                Method method = signature.getMethod();                if (method.getAnnotation(ReadOnlyDataSource.class) == null||(checkWriteInReadonly&&DistributedContext.getDBWriteRecord().isUpdatedIn(dbSyncSecond))) {//写                    DataSourceContextHolder.defaultDataSource();                    ....                } else {//读                    if (dataSourceAdapter == null) {                        DataSourceContextHolder.readDataSource();                    } else {                        DataSourceContextHolder.readDataSource(dataSourceAdapter);                    }                }                                           }            result = joinPoint.proceed();        } finally {            if (flag) {                DataSourceContextHolder.clearDataSource();            }        }        return result;    }

参考:http://www.cnblogs.com/surge/p/3582248.html


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表