首页 > 解决方案 > Oracle.ManagedDataAccess.Core 的高内存使用率

问题描述

我需要一点帮助。

我现在面临 Oracle.ManagedDataAccess.Core 的问题。

我有一个为集中式 oracle 查询Clases.Oracle()(真正的问题是它永远不会释放该内存,如果我再次执行该查询,则会上升到 2GB,这是迄今为止的上限。 诊断工具

我试过添加GC.Collect()GC.WaitForPendingFinalizers()没有结果。

我的命令执行功能Clases.Oracle()是:

        private DataTable ExecuteReader(string package, ref OracleParameter[] parametros, string owner)
        {
            var dt = new DataTable();
            using (var cn = new OracleConnection(_connection_string))
            {
                using var cmd = cn.CreateCommand();
                try
                {
                    cn.Open();
                    cmd.CommandText = $"{owner}.{package}";
                    cmd.CommandType = CommandType.StoredProcedure;
                    foreach (var par in parametros)
                    {
                        cmd.Parameters.Add(par);
                    }
                    using var rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    dt.Load(rdr);
                }
                catch (Exception ex)
                {
                   
                    throw new Exceptions.OracleException(ex.Message);
                }
                finally
                {
                    cn?.Close();
                    cmd?.Dispose();
                    cn?.Dispose();
                }
            }
            return dt;
        }

我正在使用该using子句,因此对象正在处理。

我用这个函数调用连接:

        public List<AuditoriaUsuarios> ObtieneAuditoriaUsuarios(long incluyeCargoRol = 0)
        {
            var ora = new Clases.Oracle();
            var param = new OracleParameter[]
            {
                ora.AddInParameter("PIN_INCLUYECARGOROL",OracleDbType.Decimal, incluyeCargoRol),
                ora.AddOutCursor("CUR_OUT"),
                ora.AddOutParameter("PON_CODE", OracleDbType.Decimal),
                ora.AddOutParameter("POV_ERROR", OracleDbType.Varchar2)
            };
            var result = ora.ExecuteReader<AuditoriaUsuarios>($"{_PCK}.p_AUDIT_USUARIOS", ref param);
            if (ora.HayError(param))
            {
                throw new Exceptions.OracleException(ora.CodigoError, ora.MensajeError);
            }
            //GC.Collect();
            //GC.WaitForPendingFinalizers();
            return result;
        }

Clases.Oracle()不需要是一次性的,因为我使用的所有对象都是一次性的,并且正在被处置,以及 ConnectionString 的 2 个字符串和数据库所有者的名称。

这是来自 VS 的内存使用转储 内存使用情况

在 ExecuteReader 完成并返回结果之后很长时间,您可以看到OracleInternal.Common.ZoneValue使用大量内存的 oracle 相关对象 ()。

不知道我是不是做错了什么。

编辑:
我忘记了。这是一个 ASP .Net Core x64 WebAPI,使用 .NET Core 3.1 和 C#,以及 Visual Studio 2019 Enterprise。

Edit2:
我知道它很脏,但是添加它ObtieneAuditoriaUsuarios会使事情变得更好。(在这种情况下,我不关心 CPU 使用率,因为这个数据提取应该每周执行几次,而不是日常操作的一部分):

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);

Edit3:我同时发送了 8 个请求,在某些测试中内存使用量上升到 3GB。但只需要 1 个请求,过滤器返回少于 100 行,内存使用量降至 1GB 以下

内存使用量下降

标签: c#asp.net-core-mvcoracle.manageddataaccess

解决方案


推荐阅读