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"); } }
以上方法有很多缺点,限制,使用的方法二是以注解的形式实现
方案二(预备)
推荐阅读
-
Mysql 读写分离的 Java 实现 博客分类: 缓存和数据库 读写分离ThreadLocal
-
mysql 主从复制读写分离实现(详细) 博客分类: 数据库 Mysql主从读写分离master/slavemysql proxy
-
zeus,轻量级持久层框架 博客分类: 持久层架构sharding 读写分离分库分表zeus持久层框架
-
linux mysql proxy 的安装,配置,以及读写分离 博客分类: Mysql mysqlmysql proxy安装读写分离
-
spring的数据库读写分离 博客分类: WEB框架 读写分离spring
-
提升数据库性能的重要手段--冗余 博客分类: 架构mysql 读写分离镜像同步非对称同步
-
spring读写分离 博客分类: spring spring读写分离
-
分享我的开源项目-spring+mybatis实现读写分离 企业应用Spring读写分离
-
基于mybatis的读写分离插件 博客分类: Mybatis mybatis读写分离github
-
mysql+spring+mybatis实现数据库读写分离的代码配置