欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring的数据库读写分离 博客分类: WEB框架 读写分离spring 

程序员文章站 2024-02-14 09:34:40
...

方案一

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

}

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

 

方案二(预备)

 

相关标签: 读写分离 spring