我正在使用 Oracle.ManagedDataAccess
Nuget 包版本 18.3.0
。我尝试了很多东西。我试图处理我能想到的所有东西,甚至是 oracle 参数对象。并将所有内容包装在 using
block 中,但无济于事。唯一真正对我有用的是注释行 OracleConnection.ClearPool(oracle);
。这是一个错误,还是一些与配置相关的问题,还是我误解了这里的内容?此外,我尝试删除对 Oracle.ManagedDataAccess
的引用,并将其替换为对 System.Data.OracleClient
的引用,这实际上对我有用。它会自动关闭连接,因此没有连接处于“事件”状态。下面的代码我将它移到了一个简单的、单一的按钮、Windows 窗体应用程序中,以确保 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
打开的连接的图像。
当然,每次单击该按钮,上面的代码都会执行,并且新 session 将保持打开状态,直到您在图像中看到。
名称“TheTesterOfAllTests.exe”是 Windows 窗体应用程序。
这是配置问题吗?
除了使用 ClearPool
方法之外,还有什么方法可以解决这个问题吗?因为它会影响应用程序的性能。
附言最初使用上述代码的应用程序是一个由 Web 应用程序使用的 WCF 服务
。
附言2 存在某种内存泄漏,每次单击该按钮都会增加内存使用量
最佳答案
我遇到了同样的问题。 我通过更改 OracleConnection 的初始化解决了这个问题。
来自
var con = new OracleConnection(
"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=SomePortHere))(CONNECT_DATA=(SERVER=SHARED)(SERVICE_NAME=anotherHost)))",
new OracleCredential(userName,password));
到
var con = new OracleConnection(
"USER ID=myuser;PASSWORD=mypwd;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=SomePortHere))(CONNECT_DATA=(SERVER=SHARED)(SERVICE_NAME=anotherHost)))");
对我来说,这种不同的行为看起来像是一个错误。
因此,我不能再使用 OracleCredential,必须将密码存储为字符串。这对我来说没问题。
关于c# - Oracle Managed DataAccess 连接对象保持连接打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54373754/