Oracle Managed DataAccess连接对象使连接保持打开状态

时间:2019-01-25 22:41:38

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

我正在使用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打开的连接的图像。
Oracle Connection issue 当然,每次单击该按钮,上面的代码将执行,并且新会话将保持打开状态,直到您在图像中看到为止。 Windows窗体应用程序是名称“ TheTesterOfAllTests.exe”。
这是配置问题吗? 除了使用ClearPool方法以外,还有什么方法可以解决此问题?因为它会影响应用程序的性能。
P.S。最初使用上述代码的应用程序是WCF Service,它是Web应用程序使用的。
P.S。 2内存泄漏,每次单击该按钮都会增加内存使用量

1 个答案:

答案 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>