国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

讀寫分離

2019-11-08 21:00:13
字體:
供稿:網(wǎng)友

要求幾秒鐘之內(nèi)有寫請求,哪怕配置讀數(shù)據(jù)庫,也要使用master數(shù)據(jù)庫

可以借助sPRing 的AbstractRoutingDataSource主要實(shí)現(xiàn)determineTargetDataSource抽象方法,去獲取對應(yīng)的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();    }    /**     * 清除只讀數(shù)據(jù)源     */    public static void clearDataSource() {        contextHolder.remove();    }    /**     * 設(shè)置為只讀數(shù)據(jù)源     */    public static void readDataSource() {        readDataSource(new PollingDataSourceAdapter());    }    public static void readDataSource(DataSourceAdapter adapter){        setDataSourceName(adapter.calculate(DynamicDataSource.dataSourceNames));    }    /**     * 設(shè)置為只讀數(shù)據(jù)源     */    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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 天峨县| 鄂温| 黔江区| 陆良县| 星座| 全椒县| 秦皇岛市| 银川市| 宜章县| 孟州市| 遂平县| 泗洪县| 石城县| 夏邑县| 江川县| 肥城市| 江门市| 通江县| 民权县| 莱西市| 龙口市| 炎陵县| 都江堰市| 化隆| 常熟市| 凤庆县| 城固县| 汶上县| 彰化县| 利津县| 阜新| 宁津县| 沙雅县| 久治县| 呼伦贝尔市| 襄樊市| 九龙坡区| 普格县| 佳木斯市| 金平| 泰安市|