mycat自动重启

前言

mycat是一个非常著名的分库分表中间件,但是很多使用过这个中间件的人都会遇到一个共通的问题,那就是mycat的进程总是会重启,同时重启的时候应用的代码里面也会报出 Java.lang.NullPoint_er_Exception , 今天就来分析一下这个问题,以及解决办法!

原理

这个mycat的重启问题可能一部分人遇到了,一部分人没有遇到过,这是为什么呢?               

实际上这段mycat的bug代码是出现在了跨库结果集合并后,释放堆外内存的代码上面         

有一部分有经验的人知道分库分表中间件是不太适用于跨库查询的,这些有经验的人会让业务代码去一个一个库查出数据库后,让业务代码自己去做数据合并,排序的逻辑,如果是这样的话就完美避开了这个问题。

比如我用mycat的注解

/*#mycat: datanode=dn1*/select * from ljj_table

/*#mycat: datanode=dn2*/select * from ljj_table

这样就强行指定了datanode的节点,就算我sql里面没有分库字段也可以去这个库里面查出数据。然后在业务里面把select出来的结果进行合并

但是对于很多中小型的公司来说,因为经验不足,以及代码的快速迭代,是允许mycat跨库查询的,这就导致了mycat内部需要做排序,这样做的话就有几率触发堆外内存重复释放的bug导致重启。

比如我直接执行

select * from ljj_table

这样的sql,mycat内部就会进行汇聚以及排序,就会导致空指针。

代码REVIEW以及修改方法

这个问题的代码主要问题就是出在了 MultiNodeQueryHandler

这个类上面,在这个类里面,有几个释放资源的类需要做出修改。

在方法 outputMergeResult(这个类里面有2个outputMergeResult,都要改!)

里面,我们需要调整释解锁与释放堆外内存的顺寻

原先是

lock.unlock();

dataMergeSvr.clear();

现在我们需要改成


dataMergeSvr.clear();

lock.unlock();

以及在这个类的clearResources方法里面,我们需要加上锁

原先是

if(dataMergeSvr!=null){

    dataMergeSvr.clear();

}

现在改成

lock.lock();

try{

if(dataMergeSvr!=null){

    dataMergeSvr.clear();

}

}finally{

lock.unlock();

}

这样改完后,我们就保证了dataMergeSvr.clear()这个方法的原子性。

还有在AbstractConnection这个类上面的cleanup方法上面加上sync的锁,这样mycat的重启问题就彻底修复了。

不修改源码覆盖源代码

答案是可以的!我知道很多公司维护mycat的都是dba和运维,这里可以利用mycat自带的wrapper功能(加载外部jar包)来进行直接修复

我把我改完的这2个类的jar(仅针对mycat1.6版本)已经上传到了网盘

链接:https://pan.baidu.com/s/1coay5H-QE7ED26UWuKsL5g 
提取码:ygad

把我的这个jar包mycatExtend.jar放到mycat的lib目录下

比如\Mycat-server-1.6\mycat\lib下面

然后在conf文件里面的wrapper.conf这个文件里面设置地址

wrapper.java.classpath.1=lib/mycatExtend.jar

wrapper.java.classpath.2=lib/wrapper.jar  
wrapper.java.classpath.3=conf  
wrapper.java.classpath.4=%REPO_DIR%/*

转载的案例:http://www.bieryun.com/84230.html

wrapper.java.classpath.4=%REPO_DIR%没有/*会导致mycat报错无法启动。建议修改时导入第一行,其它行修改一下数字这样可以防止不必要的问题。

 

这样就大功告成啦~~~启动mycat!问题修复!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值