簡體   English   中英

Oracle 快速連接故障轉移不適用於 ODP.NET。 獲取連接請求超時錯誤

[英]Oracle Fast Connection Failover not working for ODP.NET. Getting Connection Request Timeout Error

我正在為我的 MVC 項目使用 ODP.NET,並且在數據庫出現故障然后再次恢復時不斷收到“-1000 連接請求超時錯誤”。 一旦我回收 IIS AppPool,它就會開始工作。 我嘗試在 catch 塊內使用 ClearAllPool()、ClearPool(connection) 來刪除錯誤連接,但兩者都不起作用。 我在 StackOverflow 上找到了一篇通過在連接字符串中添加 HA events=true 來使用快速連接故障轉移的帖子。 我也試過了,但沒有運氣。 我問過 DBA,他們說該功能默認在服務器端。 我不知道為什么即使數據庫已啟動並正在運行,ODP.NET 仍在使用數據庫關閉時創建的舊無效連接? 我的所有代碼也都包含在一個 using 塊中,該塊將關閉/處理連接。 我的 Oracle.DataAccess 版本是 12.1.0。 我閱讀了谷歌上關於連接池、FCF 的每一頁,但沒有任何幫助。

我的連接字符串如下:

<add name="XXX"; providerName="Oracle.DataAccess.Client"; connectionString="DataSource=XXX;username=xxx;password=XXX;Pooling=True;Connection Timeout=120; Connection LifeTime=120; Validate Connection=True; Min Pool size=1;Max Pool size=180; HA events=true; Incr Pool size=5; Decr Pool size=2;"/>

這是我的 oracle 連接代碼:

using(OracleConnection conn= new OracleConnection(connectionstring))
{
    try
   {
      OracleCommand cmd=new OracleCommand("storedprocedure",conn) 
      {CommandType=CommandType.StoredProcedure};
      //add parameters to command
        foreach(var parmeter in parameters)
        {
        cmd.Parameters.Add(parameter);
        }
        conn.Open(); // this is where exception occurs

        cmd.ExecuteNonQuery();

    }
   catch(OracleException ex)
   {
     if(conn.State=ConnectionState.Open)
     {
      conn.Close();
      conn.Dispose();
     }

     //log exception ex in logfile

   }

      if(conn.State=ConnectionState.Open)
      {
       conn.Close();
       conn.Dispose();
      }
}
//Dispose All Parameters using Dispose() outside using statement.
foreach(var parmeter in parameters){
parameter.Dispose();
}

唯一的解決方案是當我設置 Pooling=False 時,我們不想這樣做。

我玩過這些連接字符串屬性,例如增加最小池大小、增加連接生命周期等,但似乎沒有任何效果。

我真的很感激這里的任何幫助。

謝謝你。

試試這個並告訴我你是否還有這個問題

using(OracleConnection conn= new OracleConnection(connectionstring))
using(OracleCommand cmd=new OracleCommand("storedprocedure",conn))
{
    cmd.CommandType=CommandType.StoredProcedure;
    foreach(var parmeter in parameters)
    {
        cmd.Parameters.Add(parameter);
    }
    conn.Open(); // this is where exception occurs
    cmd.ExecuteNonQuery();
}

如果不需要錯誤,則將整個塊放入try/catch

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM