2011-11-02 36 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而引起的。

经过必要的调整后,一切运行平稳。

相关问题