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的重启问题就彻底修复了。
如果不修改源码重新打包?有什么简单的方法可以直接改掉这个类吗?(针对dba和运维)
答案是可以的!我知道很多公司维护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这个文件里面设置地址
\# Java Classpath (include wrapper.jar) Add class path elements as \# needed starting from 1 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%
这样就大功告成啦~~~启动mycat!问题修复!!!!!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python可视化决策树【Matplotlib/Graphviz】
决策树是一种流行的有监督学习方法。决策树的优势在于其既可以用于回归,也可以用于分类,不需要特征缩放,而且具有比较好的可解释性,容易将决策树可视化。可视化的决策树不仅是理解你的模型的好办法,也是向其他人介绍你的模型的运作机制的有利工具。因此掌握决策树可视化的方法对于数据分析工作者来说非常重要。 机器学习相关教程:TensorFlow实战 | 机器学习基础 | 深入浅出Flask | Python基础 在这个教程里,我们将学习以下内容: 如何使用scikit-learn训练一个决策树模型 如何使用Matplotlib将决策树可视化 如何使用Graphviz将决策树可视化 如何将随机森林或决策树包中的单个决策树可视化 教程的代码可以从这里下载。现在让我们开始吧。 1、用scikit-learn训练决策树模型 为了可视化决策树,我们首先需要用scikit-learn训练出一个决策树模型。 首先导入必要的Python库: import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.data...
- 下一篇
探索云计算的利与弊
现在市面上有非常多的云计算服务,这种丰富程度甚至可能会让亚马逊的远见者震惊,他们在大约15年前重新打造了互联网时代可出租基础设施的概念,随后该行业强大的创新力量推动该技术的快速发展,该技术分为三个子类别-IaaS、PaaS和SaaS-众多供应商提供数百种服务。 但是,当大多数企业IT运营团队想到云计算时,他们通常会想到IaaS和SaaS。这是因为很多企业转向云服务来提高IT效率、灵活性以及对不断变化的业务需求的响应能力。而PaaS主要针对开发人员,远不如其他两个类别流行。 为了熟悉技术基础知识,用户应了解云计算的优缺点、流行的用例以及当前IT市场的主要参与者以及它们如何影响其他供应商。 三巨头主导云计算市场 云市场的大部分焦点落在三大提供商上:AWS、微软和谷歌。现在这三者都提供数百种工具和服务,但以前并不是这样。 AWS最初推出的三项服务现在仍然是其产品组合的核心:Amazon Elastic Compute Cloud(Amazon EC2)、Amazon Simple Storage Service(Amazon S3)和Amazon Simple Queue Services(...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装