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次会议。关闭我的应用程序后,会话被删除。
对不起,但是......你在哪里关闭连接? – m0skit0
关闭连接后会话保持打开的事实很可能是由于您启用了连接池,这是默认连接池。超时是在一段固定的时间之后发生还是会发生变化? – Mike
它由使用块完成。这关闭和配置连接。 – Koen