c# - Oracle Managed DataAccess 连接对象保持连接打开

标签 c# oracle ado.net system.data.oracleclient oracle.manageddataaccess

我正在使用 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 打开的连接的图像。
Oracle Connection issue 当然,每次单击该按钮,上面的代码都会执行,并且新 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,必须将密码存储为字符串。这对我来说没问题。

备注:SecureString shouldn't be used

关于c# - Oracle Managed DataAccess 连接对象保持连接打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54373754/

相关文章:

c# - XDocument.XPathSelectElements : I can't seem get the xpath syntax right

c# - 如何以编程方式启动 IIS 6.0 SMTP 虚拟服务器?

sql - 为更大的选择查询的每一行选择一个表或数组

c# - 如何使用实用程序类管理 SQL 连接?

c# - EF6 postgresql 数据库优先,无法生成模型

c# - 当我在文本框中输入时发出烦人的哔哔声

java - MyBatis 调用带有返回值和 out 参数的存储函数

Oracle的DBMS_UTILITY.GET_HASH_VALUE函数的Java实现

mysql - 数据库世界中的提供者和连接器有什么区别?

c# - C# (.NET) 中的 string.Length 是即时变量吗?