主要错误信息:
dubbo:com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method...
Caused by: com.alibaba.dubbo.remoting.RemotingException: message can not send, because channel is closed .
MySQL版本:8.0.15
Eclipse版本: 2018-12 (4.10.0)
dubbox版本:2.8.4
zookeeper版本:3.4.6
近期使用dubbox、zookeeper搭建一个项目时主要出现上述问题。
一开始定位最简单的BUG(timeout),以为是设置的timeout时间不够(默认1000ms),后来设置将超时时间加长为60000ms。
<dubbo:provider delay="-1" timeout="60000" retries="0"/>
发现还是timeout,判断不是超时问题。
后续又检查了linux的网络地址,类的序列化都没有问题。
用一个小的不涉及查询的demo测试了下,发现可以正常访问及返回。
说明网络地址没问题,检查了类都进行了序列化。
考虑是调用方法中的查询操作有问题导致超时。
于是测试查询,发送无法正常返回数据。
初步定位问题出现在dao层。
考虑可能是jdbc驱动版本、xml文件语句等问题。
首先检查简单的,容易测试问题,将xml中的sql语句,直接放入Navicat运行发现正常。
考虑可能是驱动版本等问题。
于是先编写了一个测试案例,测试dao中需要使用的方法,发现无法正常运行。
并且弹出too many connection提升,修改了my.ini中最大连接数。
修改后再次运行,又弹出validateConnection false,原始druid版本为1.0.16,后来根据网上的建议换成了1.0.15版本。
修改后再次运行,又弹出creater connection fiail jdbc.url:localhost:3306....
考虑可能是驱动版本问题,查询以前正常项目所用jdbc版本为8.0.11,修改jdbc驱动为8.0.11
修改对应驱动配置:jdbc.driver=com.mysql.cj.jdbc.Driver(老版本驱动无需加cj,问题项目版本jdbc驱动为5.xx.xx)
修改后再次测试,运行正常,结果可以正常返回。
最后测试原有项目,运行正常。
问题原因:MySQL版本过新,较老的驱动无法正常运行,以及MySQL的一些配置问题。
本次寻找BUG总结:
这次寻找问题的过程中,一开始思路上就出现了问题。
最开始试图找到和自己所遇问题一样,可以直接生搬硬套解决问题的方案。
这种思想是不可取的,每个人所遇的问题由于平台环境等因素存在差异性。
没有找出问题出现的原因,只是单纯的按部就班,不一定能解决问题。
正确的做法应该是编写小的demo或测试,定位问题出在哪里,一步步缩小问题范围,然后针对性的寻找和分析问题。
再借助搜索引擎这样才能事半功倍。
寻找问题时应该先尝试解决容易解决的问题,如果比较同意解决的问题不是最终BUG在逐步去解决复杂的问题。