spring的数据库读写分离

方案一

1、spring的applicationContext.xml中的配置

<bean id="masterDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="jdbc:postgresql://127.0.0.1:5432/zcaqs"/>
        <property name="username" value="postgres"/>
        <property name="password" value="123456"/>
        <property name="initialSize" value="1"/>
        <property name="maxActive" value="20"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testWhileIdle" value="true"/>
        <property name="filters" value="stat"/>
    </bean>

    <bean id="slaveDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="jdbc:postgresql://127.0.0.1:5432/zcaqs"/>
        <property name="username" value="postgres"/>
        <property name="password" value="123456"/>
        <property name="initialSize" value="1"/>
        <property name="maxActive" value="20"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testWhileIdle" value="true"/>
        <property name="filters" value="stat"/>
        <!--开启监控-->
    </bean>

    <bean id="dataSource" class="org.akzx.acaqs.base.database.DynamicDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="slave" value-ref="slaveDataSource"/>
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="masterDataSource"/>
    </bean>

    <!-- 切换数据源 -->
    <bean id="dataSourceAdvice" class="org.akzx.acaqs.base.database.DataSourceAdvice"/>
    <aop:config>
        <aop:advisor
                pointcut="execution(* org.akzx.acaqs.service..*Service.*(..))"
                advice-ref="dataSourceAdvice"/>
    </aop:config>

 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");
    }

}

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

方案二(预备)

猜你喜欢

转载自814318774.iteye.com/blog/2030837
今日推荐