忙乎了将近两周终于搞定了从一开始怀疑是网络的问题后来觉得不是可能是应用的问题发现很可能是数据库的问题最后真相大白又回到原点原来是网络防火墙在捣鬼行为非常诡异怎么想也想不明白我都没多少信心准备放弃了没想到原因竟然如此简单
事情是这样的我们开发的系统需要保持和Oracle数据库的持续连接如果因为网络或者其它原因非正常断开的话必须重新启动应用程序否则将会出错无法使用在测试环境运行很稳定一搬到机房机架上就出现奇怪的现象第二天早上来看服务器所有的数据库连接都断掉了有时候白天也断而且一个应用断的次数特别频繁其它应用白天不怎么断因为我们的应用服务器网段是xx而数据库服务器在xxx网段刚开始我怀疑是中间的路由器有这种问题如果网络持续一段时间没有流量自动把网络断开并且和网管说了这事他说不可能有这种问题因为我们以前做过另外一个系统也存在这种问题好像是这个原因不过后来怎么解决的不是很清楚了找知情人士了解后原来是数据库网卡的原因从应用服务器ping数据库服务器一个晚上有几次丢包现象换数据库服务器网卡就没事了
于是我们用ping t serverIP > pingtxt 来检查网络是否有丢包现象持续几个晚上都没有一次丢包的网络状况非常好我检查网卡属性的电源属性卡上有一个复选框是否允许计算机闲置时关闭该设备默认是选中的于是我怀疑是网卡被计算机关掉了于是所有连接均断开了但是白天之断开一个解释不同啊应用程序有问题?为什么测试环境中没发现问题?有可能是某一块数据有问题他们测试时乱调图碰到雷区了于是我检查所有的数据没有那种问题真是让人费解而且我持续ping网卡也不可能被关闭的啊
有可能是某个端口关闭了于是我们写了一个小程序打开一个数据库连接每隔一定时间查一下数据库保持端口是打开的问题依旧存在这个小程序的连接没断其它的全断了
是什么原因呢?其实现在想起来问题已经很明朗了但是当时就是不明白怎么回事而且那天老是打电话过来连接又断了上午断两次下午又断了两次一整天我们都没想出什么好办法怎么会这么变态为什么会只断掉一个?我当时怀疑是我们应用程序有点问题在绞尽脑汁想办法怎么检测应用程序的错误
为了检测断开的规律我写了两个触发器用户登陆时网一个表中插入一条记录注销是把注销时间填入表中后来发现根本一点用也没有非正常退出时根本不会触发LOGOFF事件白忙乎了!
下班了骑车回家突然想到一个办法定时激活连接保持活动状态看它还断不断很多好的想法都是在我离开办公室回家的路上想出来了在办公室怎么想也想不出来离开办公室就想出了第二天马上行动果真有效连接没有再断过但是这样不是个办法为什么连接一段时间不活动就会被杀掉了呢?在我们的应用程序中看不到原因只是说连接丢失在sqlplus中提示说endoffile communication channel
今天一整天我都在网上狂找相关内容oracle connection lost oracle session lostoracle session timeout等等看到也有人碰到类似我这种情况的人但是没有好的办法我把Oracle net service得文档翻了一遍看到sqlnetora有一个关于超时的参数SQLNETEXPIRE_TIME简直如获至宝后来发现原来没用服务器端自动杀掉客户端进程的情况还可以通过Profile来实现限制IDLE_TIME但是我检查数据库根本没有相关的设置
好不容易找到一溜很长的帖子也是关于我这种问题的最后他说解决了是防火墙的问题但是以前我印象中防火墙只是针对端口的怎么会保持某些活动连接杀掉不活动的连接呢?后来我去网上查了查防火前的有关原理好象它能处理到TCP/IP连接一级也就是可以只断开某一个不活动的连接但我还是不很确定但是我知道在数据库服务器和应用服务器之间有防火墙把机器搬过去的那天能ping通数据库服务器但是不能连数据库后来网管把Oracle数据库的两个端口打开就可以了
我们找到网管他说是有这种问题防火墙就是这样的如果一个连接长时间不活动就会自动杀掉的如果不这样的话防火墙的内存很快会用完还说我们违背了TCP/IP的设计原则但是没办法我们的应用程序需要持续而稳定数据库连接只能把我们的应用服务器放到防火墙后面去于是他把我们的服务器跳了线变成一个网段的从此不再有连接断开的问题了终于彻底解决这个问题长舒一口气!!!
其实主要原因还是网络规划有问题怎么能把我们应用服务器和数据库服务器隔开呢?