SSM java切换数据源 实现读写分离
来源:互联网 发布:淘宝刷到一天能赚多少 编辑:程序博客网 时间:2024/06/08 05:58
jar包
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
</dependency>
配置数据源
<bean id="db1" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
<property name="driverClassName" value="${jdbc.driver}" />
<!-- 基本属性 url、user、password -->
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${jdbc.pool.init}" />
<property name="minIdle" value="${jdbc.pool.minIdle}" />
<property name="maxActive" value="${jdbc.pool.maxActive}" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="${jdbc.testSql}" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
</bean>
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
String dbKey=DataSourceHolder.getDataSources();
return dbKey;
}
}
用ThreadLcoal管理当前数据源
public class DataSourceHolder {
private static final ThreadLocal<String> dataSources = new ThreadLocal<String>();
public static void setDataSources(String dataSource) {
dataSources.set(dataSource);
}
public static String getDataSources() {
return dataSources.get();
}
}
AOP支持
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* 动态切换数据源切面
*/
@Component
@Aspect
@Order(-1)
public class DynamicDataSourceInterceptor {
@Around(value = "@annotation(switchDB)")
public Object process(ProceedingJoinPoint point, SwitchDB switchDB) throws Throwable {
Object returnValue;
try {
DataSourceHolder.setDataSources(switchDB.dbID());
returnValue = point.proceed(point.getArgs());
} finally {
DataSourceHolder.setDataSources(null);
}
return returnValue;
}
}
注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 动态切换数据源
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SwitchDB {
String dbID();
}
在spring里面扫描
<aop:aspectj-autoproxy proxy-target-class="true" />
<context:component-scan base-package="cn.zj.pubinfo.comm.mybatis.spring.dynamicdb"><!-- base-package
如果多个,用“,”分隔 -->
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
在service层方法中添加注解
@SwitchDB(dbID = "db1")
public List<String> find() {
return userDao.find();
}
db1已经在数据源配置中配置
现在即可以切换数据源进行操作了。
阅读全文
0 0
- SSM java切换数据源 实现读写分离
- 案例-数据源切换读写分离
- spring hibernate配置切换数据源,实现读写分离
- 基于springAop动态切换数据源实现读写分离
- JAVA-SSM框架中配置mysql读写分离,动态加载数据源
- SSM框架集成mysql读写分离,动态加载数据源
- Java实现读写分离
- ssm读写分离
- ssm读写分离
- 数据源读写分离 -- replication
- java实现数据库读写分离
- AOP的动态数据源配置,实现读写分离
- Spring 动态数据源和AOP实现数据库读写分离
- ssm框架 数据库读写分离
- SSM(八)动态切换数据源
- SSM(八)动态切换数据源
- Mycat实现mysql读写分离及故障切换
- 利用MyCAT实现MySQL的读写分离和主从切换
- java开发者常用的linux指令
- Vue2 ( 3 ) 过渡
- 《JavaScript》高级程序设计第21章:Ajax和Comet,jsonp
- [bzoj1059]矩阵游戏
- 算法机考模拟题1005.最大和
- SSM java切换数据源 实现读写分离
- AjaxJson
- 甲骨文解读: 公共资源
- ubus
- sql profile: 如何使用我们自定义的sql 执行计划来固定原sql执行计划 及 如何优化非绑定变量sql
- js+css简单导航栏特效
- 深度学习理论与技术的重点研究方向
- Web系统大规模并发:电商秒杀与抢购
- Archlinux(generic) Linux 下安装安装配置tensorflow_gpu_1.2.0