2011-11-02 33 views
0

在測試新應用程序時,我們遇到了一個問題,即有時存儲過程需要1分鐘才能執行並導致超時。特別是它不是一個存儲過程,它可以是任何存儲過程。Oracle會話在關閉連接後保持開放

試圖重現問題我創建了一個小的(本地)testapp,它在不同的線程(下面的代碼)中調用相同的存儲過程。

現在看來Oracle會話仍然存在。非活動。 Oracle服務器的CPU達到100%。 我使用System.Data.OracleClient

我不確定一個是否與另一個相關,但它會減慢從數據庫獲得答案所需的時間。

for (int index = 0; index < 1000; ++index) 
{ 
    ThreadPool.QueueUserWorkItem(GetStreet, index); 
    _runningThreads++; 
    WriteThreadnumber(_runningThreads); 
} 

private void GetStreet(object nr) 
{ 
    const string procName = "SPCK_ISU.GETPREMISESBYSTREET"; 
    DataTable dataTable = null; 
    var connectionstring = ConfigurationManager.ConnectionStrings["CupolaDB"].ToString(); 
    try 
    { 
     using (var connection = new OracleConnection(connectionstring)) 
     { 
      connection.Open(); 
      using (var command = new OracleCommand(procName, connection)) 
      { 
       //Fill parameters 
       using (var oracleDataAdapter = new OracleDataAdapter(command)) 
       { 
        //Fill datatable 
       } 
      } 
     } 
    } 
    finally 
    { 
     if (dataTable != null) 
      dataTable.Dispose(); 
    } 
} 

編輯: 我只是讓DBA使打開的會話的數量並且有繼續開放,不活動105次會議。關閉我的應用程序後,會話被刪除。

+0

對不起,但是......你在哪裏關閉連接? – m0skit0

+0

關閉連接後會話保持打開的事實很可能是由於您啓用了連接池,這是默認連接池。超時是在一段固定的時間之後發生還是會發生變化? – Mike

+0

它由使用塊完成。這關閉和配置連接。 – Koen

回答

1

問題解決了。

我們聘請了一位Oracle專家來看看這個問題,這個問題是由於一些潛在的存儲過程需要一段時間來執行並消耗大量的CPU而引起的。

經過必要的調整後,一切運行平穩。

相關問題