当前位置:首页 > 开发 > 系统架构 > 架构 > 正文

spring的数据库读写分离

发表于: 2014-03-14   作者:补耍狠   来源:转载   浏览:
摘要: 方案一 1、spring的applicationContext.xml中的配置   <bean id="masterDataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="url" value

方案一

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的数据库读写分离

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
什么是数据库的读写分离 数据库的读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服
什么是数据库的读写分离 数据库的读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服
什么是数据库的读写分离 数据库的读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服
什么是数据库的读写分离 数据库的读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服
现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据
现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据
现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据
现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据
  现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave
现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号