实现spring+mybatis+uncode dal,应用自动切换连接数据库

前面使用spring+mybatis+uncode dal
实现应用与postgresql主从数据库集成实现读写分离


那么在主数据库连接错误的情况下,如何保证在主数据库发生异常情况下任何数据库请求都能够正确执行
并且能够快速的尝试其他数据库
可以有两种方式
1.目前的DynamicDataSource获取数据库连接异常就会立即抛出异常,不会重试
对dal的cn.uncode.dal.datasource.DynamicDataSource类进行扩展
重写其getConnection方法
在获得datasource的connection错误时,立即切换到其他数据库并重新获取其连接,
指定mybatis使用这种新的datasource


2.实现mybatis的拦截器,
这种方式可以指定哪类方法访问哪些数据库,并且在获取数据库连接错误的时候
可以尝试获取其他数据库的连接

需要做以下修改
a.定义新的inteceptor
Mybatis拦截器只能拦截四种类型的接口:Executor、StatementHandler、ParameterHandler和ResultSetHandler。
这是在Mybatis的Configuration中写死了的,如果要支持拦截其他接口就需要我们重写Mybatis的Configuration。
Mybatis可以对这四个接口中所有的方法进行拦截。
参照http://haohaoxuexi.iteye.com/blog/1851081

拦截器中可以根据方法名来设定route
(例如下面定义拦截器对所有executor的query方法进行拦截,设定路由为读,那么后面获取 连接只会从从数据库列表中获取
并且设定重试机制)
@Intercepts(  @Signature(method = "query", type = Executor.class, args = {
        MappedStatement.class, Object.class, RowBounds.class,
        ResultHandler.class }))
public class MyInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
       int count=0;
        DBContextHolder.switchRead()
        while(count<=3) {
            try {
                return 
invocation.proceed();
            } catch (Exception e) {
                count=count+1;
            }
        }
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object o) {
        return Plugin.wrap(o, this);
    }

    @Override
    public void setProperties(Properties properties) {

    }
}
2.在mybatis配置文件中注册新的interceptor
在mybatis-config.xml中指定拦截器
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <plugins>
        <plugin interceptor="<包名.MyInterceptor"></plugin>
    </plugins>
</configuration>

3.为了能够快速切换数据源, 需要指定druiddatasource的
jdbc.pool.maxWait = 1000
这样1s内连接不成功,就会抛出异常,拦截器捕获到异常就会重试

4.原有使用mybatis dao的代码不用做任何修改
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值