我正在使用Oracle.ManagedDataAccess
的Nuget软件包版本18.3.0
。我尝试了很多事情。我试图处理掉所有我能想到的东西,甚至oracle参数对象。并将所有内容包装在using
块中,但无济于事。唯一对我有用的是注释行OracleConnection.ClearPool(oracle);
。这是错误,还是某些与配置相关的问题,还是我误解了这里的内容?另外,我尝试删除对Oracle.ManagedDataAccess
的引用,并替换为对System.Data.OracleClient
的引用,这实际上对我有用。它会自动关闭连接,因此没有连接处于“活动中”状态。下面的代码将其移至一个简单的单按钮Windows Forms应用程序中,以确保100%确保没有任何干扰并且问题仍然存在。
using (var oracle = new OracleConnection("Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=SomePortHere))(CONNECT_DATA=(SERVER=SHARED)(SERVICE_NAME=anotherHost)))", new OracleCredential(userName,password)))
{
oracle.Open();
using (var command = new OracleCommand())
{
var query = "SELECT x from y where z=:param1";
command.Connection = oracle;
command.CommandText = query;
command.CommandType = System.Data.CommandType.Text;
var param1 = new OracleParameter(":param1", xyz);
command.Parameters.Add(param1);
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
//read the data from the reader
}
}
param1.Dispose();
}
//If this line is commented, there will be a connection left open, with InActive status
//OracleConnection.ClearPool(oracle);
}
password.Dispose();
return myData;
这是显示通过Toad
打开的连接的图像。
当然,每次单击该按钮,上面的代码将执行,并且新会话将保持打开状态,直到您在图像中看到为止。
Windows窗体应用程序是名称“ TheTesterOfAllTests.exe”。
这是配置问题吗?
除了使用ClearPool
方法以外,还有什么方法可以解决此问题?因为它会影响应用程序的性能。
P.S。最初使用上述代码的应用程序是WCF Service
,它是Web应用程序使用的。
P.S。 2内存泄漏,每次单击该按钮都会增加内存使用量
答案 0 :(得分:0)
事实证明,问题在于oracle在内部创建连接的方式,因为对于每个新创建的OracleConnection
对象,都会向连接池中添加一个新的Connection。我在连接池中计算了91
个连接条目。
解决方案是为每个请求“每个请求范围”使用一个OracleConnection
实例。我实现了一个简单的通用IDatabase<TConnection>
接口和一个TConnection GetConnection<TConnection>()
方法,当然,对于将在同一请求实例上调用的每个方法,都会发生一对Open / Close调用,因此我们不要一直保持连接打开状态。
关于内存泄漏,我仍然无法100%
确认这一点,但是当我使用Oracle.DataAccess.Client
库而不是Oracle.ManagedDataAccess
时,内存使用量大大减少了。因此,我切换回Oracle.DataAccess.Client
。
PS 在有关这两个问题的新信息的情况下,我将更新此答案,我们非常欢迎您提供帮助,也许我误解了有关Oracle如何处理数据库连接的信息。 < / p>