忙乎了將近兩周
終於搞定了
從一開始懷疑是網絡的問題
後來覺得不是
可能是應用的問題
發現很可能是數據庫的問題
最後真相大白又回到原點
原來是網絡防火牆在搗鬼
行為非常詭異
怎麼想也想不明白
我都沒多少信心准備放棄了
沒想到原因竟然如此簡單
事情是這樣的
我們開發的系統需要保持和Oracle數據庫的持續連接
如果因為網絡或者其它原因非正常斷開的話
必須重新啟動應用程序
否則將會出錯無法使用
在測試環境運行很穩定
一搬到機房機架上就出現奇怪的現象
第二天早上來看服務器
所有的數據庫連接都斷掉了
有時候白天也斷
而且一個應用斷的次數特別頻繁
其它應用白天不怎麼斷
因為我們的應用服務器網段是
x
x
而數據庫服務器在
x
x
x網段
剛開始我懷疑是中間的路由器有這種問題
如果網絡持續一段時間沒有流量自動把網絡斷開
並且和網管說了這事
他說不可能有這種問題
因為我們以前做過另外一個系統也存在這種問題
好像是這個原因
不過後來怎麼解決的不是很清楚了
找知情人士了解後原來是數據庫網卡的原因
從應用服務器ping數據庫服務器一個晚上有幾次丟包現象
換數據庫服務器網卡就沒事了
於是我們用ping
t server
IP > ping
txt 來檢查網絡是否有丟包現象
持續幾個晚上都沒有一次丟包的
網絡狀況非常好
我檢查網卡屬性的電源屬性卡上有一個復選框是否允許計算機閒置時關閉該設備
默認是選中的
於是我懷疑是網卡被計算機關掉了
於是所有連接均斷開了
但是白天之斷開一個解釋不同啊
應用程序有問題?為什麼測試環境中沒發現問題?有可能是某一塊數據有問題
他們測試時亂調圖碰到雷區了
於是我檢查所有的數據
沒有那種問題
真是讓人費解
而且我持續ping
網卡也不可能被關閉的啊
有可能是某個端口關閉了
於是我們寫了一個小程序
打開一個數據庫連接
每隔一定時間查一下數據庫
保持端口是打開的
問題依舊存在
這個小程序的連接沒斷
其它的全斷了
是什麼原因呢?其實現在想起來問題已經很明朗了
但是當時就是不明白怎麼回事
而且那天老是打電話過來
連接又斷了
上午斷兩次
下午又斷了兩次
一整天我們都沒想出什麼好辦法
怎麼會這麼變態
為什麼會只斷掉一個?我當時懷疑是我們應用程序有點問題
在絞盡腦汁想辦法怎麼檢測應用程序的錯誤
為了檢測斷開的規律
我寫了兩個觸發器
用戶登陸時網一個表中插入一條記錄
注銷是把注銷時間填入表中
後來發現根本一點用也沒有
非正常退出時根本不會觸發LOGOFF事件
白忙乎了!
下班了
騎車回家
突然想到一個辦法
定時激活連接
保持活動狀態看它還斷不斷
很多好的想法都是在我離開辦公室回家的路上想出來了
在辦公室怎麼想也想不出來
離開辦公室就想出了
第二天馬上行動
果真有效
連接沒有再斷過
但是這樣不是個辦法
為什麼連接一段時間不活動就會被殺掉了呢?在我們的應用程序中看不到原因
只是說連接丟失
在sqlplus中提示說end
of
file communication channel
今天一整天我都在網上狂找相關內容
oracle connection lost
oracle session lost
oracle session timeout等等
看到也有人碰到類似我這種情況的人
但是沒有好的辦法
我把Oracle net service得文檔翻了一遍
看到sqlnet
ora有一個關於超時的參數SQLNET
EXPIRE_TIME簡直如獲至寶
後來發現原來沒用
服務器端自動殺掉客戶端進程的情況還可以通過Profile來實現
限制IDLE_TIME
但是我檢查數據庫根本沒有相關的設置
好不容易找到一溜很長的帖子
也是關於我這種問題的
最後他說解決了是防火牆的問題
但是以前我印象中防火牆只是針對端口的
怎麼會保持某些活動連接
殺掉不活動的連接呢?後來我去網上查了查防火前的有關原理
好象它能處理到TCP/IP連接一級
也就是可以只斷開某一個不活動的連接
但我還是不很確定
但是我知道在數據庫服務器和應用服務器之間有防火牆
把機器搬過去的那天
能ping通數據庫服務器
但是不能連數據庫
後來網管把Oracle數據庫的兩個端口打開就可以了
我們找到網管
他說是有這種問題
防火牆就是這樣的
如果一個連接長時間不活動就會自動殺掉的
如果不這樣的話
防火牆的內存很快會用完
還說我們違背了TCP/IP的設計原則
但是沒辦法
我們的應用程序需要持續而穩定數據庫連接
只能把我們的應用服務器放到防火牆後面去
於是他把我們的服務器跳了線
變成一個網段的
從此不再有連接斷開的問題了
終於徹底解決這個問題
長舒一口氣!!!
其實主要原因還是網絡規劃有問題
怎麼能把我們應用服務器和數據庫服務器隔開呢?
From:http://tw.wingwit.com/Article/program/Oracle/201311/18502.html