spring的数据库读写分离

阅读更多

方案一

1、spring的applicationContext.xml中的配置

 


        
        
        
        
        
        
        
        
    

    
        
        
        
        
        
        
        
        
        
    

    
        
            
                
            
        
        
    

    
    
    
        
    

 

 2、两个需要实现的bean类

 

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceSwitcher.getDataSource();
    }
}

public class DataSourceAdvice implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice {
    // service方法执行之前被调用
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("切入点: " + target.getClass().getName() + "类中" + method.getName() + "方法");
        if (method.getName().startsWith("add")
                || method.getName().startsWith("create")
                || method.getName().startsWith("save")
                || method.getName().startsWith("edit")
                || method.getName().startsWith("update")
                || method.getName().startsWith("delete")
                || method.getName().startsWith("remove")) {
            System.out.println("切换到: master");
            DataSourceSwitcher.setMaster();
        } else {
            System.out.println("切换到: slave");
            DataSourceSwitcher.setSlave();
        }
    }

    // service方法执行完之后被调用
    public void afterReturning(Object arg0, Method method, Object[] args, Object target) throws Throwable {
    }

    // 抛出Exception之后被调用
    public void afterThrowing(Method method, Object[] args, Object target, Exception ex) throws Throwable {
        DataSourceSwitcher.setSlave();
        System.out.println("出现异常,切换到: slave");
    }

}

 以上方法有很多缺点,限制,使用的方法二是以注解的形式实现

 

方案二(预备)

 

你可能感兴趣的:(读写分离,spring)