2011-08-22 167 views
0

我看到一個奇怪的間歇性連接失敗。我的應用程序工作得很好,然後開始拋出連接失敗異常。在應用程序再次開始工作之前,需要重置IIS。我已經能夠將一些故障追溯到Oracle羣集的意外重啓,但不是全部。有沒有其他人看到這個問題?我搜索了網頁,但沒有找到任何東西。間歇vb.net甲骨文連接問題

客戶端 - 服務器Win2003的,IIS運行ASP.net 2.0.50727,代碼是VB.NET,通過Oracle客戶端10.2.0.1.0

Server ODBC連接 - Oracle數據庫10g企業版發行10.2.0.4。 0 - 64位在Linux集羣上生產。

失敗:

Attempting connection.Open() 
FAILED connection.Open() 
Message: 
Stack Trace: 
at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src,  String procedure) 
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src) 
at Oracle.DataAccess.Client.OracleConnection.Open() 
at MABridge2._0.debug.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\xxxx\My Documents\Visual Studio  2008\Projects\xxx\debug.aspx.vb:line 19 
Closed connection 

代碼:

Imports Oracle.DataAccess.Client 
Partial Public Class debug 
Inherits System.Web.UI.Page 

Dim loggingstring As String 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    Dim connString As New String("Data Source=xxx_rac;Persist Security Info=True;User ID=xxx;Password=xxxxx;") 
    Using conn As New OracleConnection(connString) 
     Dim cmd As New OracleCommand() 
     Response.Write("Attempting connection.Open()" + "<br>") 
     Try 
      conn.Open() 
     Catch ex As OracleException 
      Response.Write("FAILED connection.Open()" + "<br>") 
      loggingstring = "Message: " + ex.Message + "<br>" + "Stack Trace:" + ex.StackTrace + "<br>" 
      Response.Write(loggingstring) 
     End Try 
     conn.Close() 
     Response.Write("Closed connection" + "<br>") 
    End Using 

End Sub 
+0

是否有任何Oracle錯誤消息和錯誤代碼可用?目前我看到一個堆棧跟蹤,但沒有Oracle錯誤代碼/消息。 –

+0

沒有錯誤消息返回。你會看到「Message:」+ ex.Message,但它什麼都沒有返回 – David

+0

我最近添加了自動通知失敗發生的時間。我見過三次失敗。它們每隔1至2周發生一次。在三種情況中的兩種情況下,所有六個集羣Web服務器都受到影響。在一種情況下,六臺服務器中的兩臺不受影響。偶爾,IIS也需要在錯誤消失之前重置兩次。 – David

回答

1

總結問題:

  • 在連接打開時出現錯誤
  • 系統已經後出現的錯誤用了一段時間
  • 錯誤是temporarilly做的IIS解決在此基礎上它的聲音,如果你的代碼泄漏連接或其它一些資源重置

對於性能計數器和事件看到:http://download.oracle.com/docs/html/B13831_01/monitor.htm#i1005706

+0

是你的3米子彈的物品。這個測試頁面非常簡單,但一旦發生故障,我無法在不重置IIS的情況下越過它。我甚至讓服務器脫機(負載平衡的環境),第二天錯誤仍然存​​在。我認爲開放連接最終會自行關閉。這也是使用該數據源的服務器上唯一的VB.net應用程序。我有另一個ASP(經典)應用程序在服務器上運行,似乎不受影響。我可以驗證下次發生的情況。 – David

+0

嘗試監視打開的連接數,並檢查連接池配置 –

+0

設拉子,在那裏我會檢查連接池的配置?我在ODBC DSN設置中看不到任何選項。我將如何去檢查打開的連接數量?你是從應用服務器到數據庫還是數據庫本身? – David

2

嘗試修改代碼來處理你的OracleCommand的實例,否則你將有可能是你的問題的原因資源泄漏。

Dim connString As New String("Data Source=...") 
Using conn As New OracleConnection(connString) 
    Using cmd As New OracleCommand() 
     Try 
      conn.Open() 
     Catch ex As OracleException 
      logger.LogError(ex.ToString()) 
      Throw 
     End Try 
    End Using 
End Using 
+0

測試理解..使用命令的目的是確保我的oracle命令對象被正確處置。但我仍然需要明確地調用conn.Close() – David

+0

OracleConnection位於'using'塊中,該塊將依次關閉連接。所以不,你不需要明確地調用close。相反的事實並非如此,調用'close'不會處理實例。 – TheCodeKing

0

我從您連接到由超過1個實例的RAC數據庫的連接字符串假定...

如果我的假設是真的,那麼有可能是另一種解釋:

在RAC配置中,您連接的Oracle監聽器會返回信息,告訴客戶端客戶端應該連接到哪個實例......這意味着:連接到監聽器A並且監聽器A告訴您連接到實例B.這是發生在「幕後」(在Oracle客戶端中,而不是在您的代碼中)。

當偵聽程序傳遞此信息時,它不會告訴您IP地址,而是一個名稱(DNS ...)。如果您的計算機無法解析該名稱,您將得到與您所描述的行爲完全相同的行爲...有時連接工作有時不會...將所有與所有RAC節點相關的主機名放入本地主機,或者(更好地)將它們設爲DNS解析在您的局域網中...

+0

我正在使用的TNS條目如下。它提供了任何線索嗎?有五個主機(爲簡潔起見而被刪除)。我很確定他們都是本地可解析的,但我可以檢查 (描述= (address =(protocol = tcp)(host = host5.xxx.com)(port = 1661)) (load_balance =是) (source_route =是) (CONNECT_DATA = (服務器=共享) (SERVICE_NAME = RDW) (failover_mode的= (類型=選擇) (方法=基本) (重試= 180) (延遲= 5) ) ) )' – David

+0

一點:主機host5.xxx.com必須通過DNS解析BEW,但這是不夠的......你需要檢查日e Oracle服務器端:有多少個RAC /集羣節點?他們有哪些名字?然後檢查所有節點的所有名稱是否解析爲Web服務器上的IP地址...... – Yahia

+0

中有五個服務器,我能ping通他們都爲Web服務器。另外,我使用telnet檢查特定端口的連通性,因爲服務器之間有防火牆。 – David