4种实例 advice aop_mybatis多数据源配置

本文介绍了两种多数据源配置情况。一是针对不同数据库,配置多个datasource、sessionFactory、mapper和session。二是处理主从库场景,通过Spring AOP和ThreadLocal在Controller或Service的方法上切换数据源,实现代码与数据库选择的分离。
摘要由CSDN通过智能技术生成

多数据源有很多情况 ,下面介绍两种

1.数据来源于不同的数据库。

这样的配多个datasource就可以了,这样datasource,sessionFactory,mapper,session就会有多份。每增加一份就会多配这4种配置就好了,

如下两个数据源,datasource的配置就是配两个bean,id不一样就行了。其它的是这样:

像上面一样同时配sqlSessionTemplate与sessionFactory可能会报错:

首先org.mybatis.spring.mapper.MapperScannerConfigurer$Scanner会报个警告:

[localhost-startStop-1] WARN org.mybatis.spring.mapper.MapperScannerConfigurer$Scanner - Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.

就是说sqlSessionTemplate与sessionFactory冲突了,不用sessionFactory,使用sqlSessionTemplate了,而如果sessionTemplate没有配

可能会报下面的错:

[localhost-startStop-1] ERROR org.mybatis.spring.mapper.MapperFactoryBean - Error while adding the mapper 'interface xx.Dao' to configuration.

java.lang.RuntimeException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class . Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'AppVersion'. Cause: java.lang.ClassNotFoundException: Cannot find class: AppVersion

at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:113)

at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:105)所在正常配置只需要三个bean:

2.主从结构的不同数据库实例,有的代码要操作主库,有的操作从库.解决办法,利用ThreadLocal保存使用数据库标识。

如在Controller或Service的方法上加一个自定义标注,使用spring aop处理这相标识,将其配置的标识写入ThreadLocal如下:

pointcut="execution(* com..*Controller.*(..))"

advice-ref="dataSourceAdvice" />

在dataSourceAdvice类里处理如下:public void before(Method method, Object[] args, Object target) throws Throwable {

try {

//DataSource是自定义标注

if (method != null && method.isAnnotationPresent(DataSource.class)) {

DataSource data = method.getAnnotation(DataSource.class);

ThreadLocal.put(data.value());

}

} catch (Exception e) {

logger.error("数据源配置有误", e);

e.printStackTrace();

}

}

而在datasource配置sessionFactory的datasource时配置可选择的数据库,如:

这个类的实现继承spring的AbstractRoutingDataSource :public class MyRoutingDataSource extends AbstractRoutingDataSource {

@Override

protected Object determineCurrentLookupKey() {

return DataSourceHolder.getDataSource();

}

}

这样就一定程序上实现了主从数据库的选择与代码分离的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值