都是防火牆惹的禍--Oracle連接總是斷

        從一開始懷疑是網絡的問題,後來覺得不是,可能是應用的問題,發現很可能是數據庫的問題,最後真相大白又回到原點,原來是網絡防火牆在搗鬼。行爲非常詭異,怎麼想也想不明白,我都沒多少信心準備放棄了,沒想到原因竟然如此簡單。
  事情是這樣的,我們開發的系統需要保持和Oracle數據庫的持續連接,如果因爲網絡或者其它原因非正常斷開的話,必須重新啓動應用程序,否則將會出錯無法使用。在測試環境運行很穩定,一搬到機房機架上就出現奇怪的現象,第二天早上來看服務器,所有的數據庫連接都斷掉了,有時候白天也斷,而且一個應用斷的次數特別頻繁,其它應用白天不怎麼斷。因爲我們的應用服務器網段是192.168.x.x,而數據庫服務器在10.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的設計原則。但是沒辦法,我們的應用程序需要持續而穩定數據庫連接,只能把我們的應用服務器放到防火牆後面去。於是他把我們的服務器跳了線,變成一個網段的,從此不再有連接斷開的問題了。終於徹底解決這個問題,長舒一口氣!!!
  
  其實主要原因還是網絡規劃有問題,怎麼能把我們應用服務器和數據庫服務器隔開呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章