2016-10-16 38 views
0

我時許調用下面打開在OracleDataReader循環另一個連接如oracle的會話不會關閉

private ArrayList GetORA() 
    {   
     ArrayList arr = new ArrayList(); 
     string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));User ID=kcdev2usr;Password=password;ENLIST=FALSE;Pooling=true;Max Pool Size=20;"; 
     const string queryString = "select * from MASTER_TABLE"; 
     using (OracleConnection connection = new OracleConnection(connectionString)) 
     { 
      OracleCommand command = new OracleCommand(queryString, connection); 
      connection.Open(); 
      OracleDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection); 
      try 
      { 
       while (reader.Read()) 
       { 
        Master m = new Master(); 
        m.ID = reader["ID"].ToString(); 
        m.obj = GetAnother(reader["SOME"].ToString()); 
        arr.Add(m); 
       } 
      } 
      finally 
      { 
       reader.Close(); 
      } 

     } 

     return arr; 
    } 


    private Object GetAnother(string some) 
    { 
     // Do something   
     string getNextID = PutSome(some); 
     //===== 
     Object obj = null; 
     string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));User ID=kcdev2usr;Password=password;ENLIST=FALSE;Pooling=true;Max Pool Size=20;"; 
     const string queryString = "SELECT PAGE_NAME FROM ANOTHER_TABLE WHERE ID=:ID"; 
     using (OracleConnection connection = new OracleConnection(connectionString)) 
     { 
      OracleCommand command = new OracleCommand(queryString, connection); 
      command.Parameters.Add("ID",getNextID); 
      connection.Open(); 
      OracleDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection); 
      try 
      { 
       while (reader.Read()) 
       { 
        obj = CreateObj(dr["PAGE_NAME"].ToString()); 
       } 
      } 
      finally 
      { 
       reader.Close(); 
      } 
     } 

     return obj; 
    } 

session is not close

下OracleDataReader循環代碼另一個連接然後不關閉有關會話問題..我我試圖移動問題的方法循環這樣的

private ArrayList GetORA() 
    {   
     ArrayList arr = new ArrayList(); 
     string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));User ID=kcdev2usr;Password=password;ENLIST=FALSE;Pooling=true;Max Pool Size=20;"; 
     const string queryString = "select * from MASTER_TABLE"; 
     using (OracleConnection connection = new OracleConnection(connectionString)) 
     { 
      OracleCommand command = new OracleCommand(queryString, connection); 
      connection.Open(); 
      OracleDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection); 
      try 
      { 
       while (reader.Read()) 
       { 
        Master m = new Master(); 
        m.ID = reader["ID"].ToString(); 
        m.Some = reader["SOME"].ToString();      
        arr.Add(m); 
       } 
      } 
      finally 
      { 
       reader.Close(); 
      } 
      foreach (var item in arr) 
      { 
       item.obj = GetAnother(item.Some); 
      } 
     } 

     return arr; 
    } 

所有甲骨文會議是乾淨,清楚,爲什麼?

  • 我的東西我的代碼不好,但我想知道ODP.Net管理oracle會話有什麼區別。

ps。我用「Oracle.DataAccess.dll」版本4.121.2.0

回答

-1

如果你想關閉會話,你應該完成你打電話connection.Dispose();

http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/hol08/dotnet/getstarted-c/getstarted_c_otn.htm

但爲什麼要在循環結束會話? 開放會話是昂貴的操作,更好的規則是有時重複使用一個連接。而且Oracle允許你使用一個用戶/傳遞給幾個會話。可能你應該考慮一下。

+1

不需要顯式調用Dispose(),因爲using語句處理該問題 –

+0

是的,我想重用會話,但是我幾天無法優化舊代碼(這是舊的應用),所以它需要一些快速解決方案在修改整個源代碼之前更改這個 – Rnan

0

您可能會看到連接池 - 「使用」調用處理將連接返回到池但不關閉它。您可以在連接字符串中設置「pooling = false」來確認,但沒有必要關閉它。

你的第二個循環可能會因爲行事的方式甲骨文的不同減小池大小:

https://docs.oracle.com/cd/B28359_01/win.111/b28375/featConnecting.htm#i1006393

這就是說,我只想讓池做它應該做的。我傾向於添加的唯一的事情是「最小池大小= 0」。這可以確保如果應用程序完全空閒,池將變爲0,並有助於防止池中的過時連接。