org.hibernate.exception.GenericJDBCException: Io exception: Connection reset,oracle查询数据错乱不一致

线上测试环境出现了数据错乱,多次刷新页面数据竟然不一样,比方说我在后台把设备名称改为a1(原来是a),页面也该展示为a1,但是刷新页面展示的效果一会儿是a,一会儿是a1,查看日志时不时出现org.hibernate.exception.GenericJDBCException: Io exception: Connection reset,oracle

解决:
原来内网的同样的数据库虚拟机,出现了2台(运维人员对虚拟机进行了迁移),所以查询和更改的数据一会儿到虚拟机a,一会儿到虚拟机b了

下面是问题的排查思路步骤:
1.出现这个问题开始以为是项目的hibernate缓存所导致,但是发现并没有使
用hibernate缓存,开始也没有太在意后台日志Connection reset这个问题,

2.这时开始怀疑是oracle服务器用了集群,但是执行后

SELECT value FROM v$parameter where name = 'cluster_database';

返回是false,说明不是集群

3.于是猜测是druid缓存,但是排查配置文件后并没有启动PreparedStatementCache配置

项目本身就是很老单体架构,没有用其他的中间件,经过1,2,3操作后基本上,暂时没有了思路,没有办法抓包吧

4.在部署tomcat的服务器上(192.168.53.41)进行抓包tcpdump,然后访问浏览器页面,当出现数据不一致文件后,停止抓包,并将抓包文件用本地的Wireshark打开
在这里插入图片描述
可以看到执行完请求后,确实是走数据库(192.168.51.15)了(TNS协议),于是可以推测肯定是数据库服务器出现了问题,而且我对接口进行压测的时候发现后台日志频繁的Connection reset,下面是错误日志
在这里插入图片描述
我先看看tcp连接吧,看看能不能找到线索
数据库(192.168.51.15)的连接情况
在这里插入图片描述
tomcat服务器(192.168.53.41)的连接情况
在这里插入图片描述
经过多次的实验对比,返现两者之间的tcp连接有差异,但是数据库的连接并没有主动去关闭,那连接没什么会不一致,而且tomcat服务器上的tcp连接的端口号,在数据库的服务器上并不存在,难道一些连接在另一个192.168.51.15上?,于是果断对数据库服务器进行关机,这时系统页面仍然可以正常访问,后台也没有错误提示,这时可以判断内网内还有一台克隆的虚拟机,再三追问运维同事,他们正在搞多台物理机虚拟化,把原来的数据库虚拟机给克隆了一个,同样的ip不仅没有报ip冲突,反而成了负载均衡了,这个问题确实是值得思考一下

猜你喜欢

转载自blog.csdn.net/zw521cx/article/details/105465884