首页 > 解决方案 > 如何处理 OracleParameter 对象?

问题描述

我有一个用 C# 编写的应用程序,它使用 Oracle.DataAccess.Client 与 Oracle 数据库交互,并且占用了大量内存。我在上面运行了 CLR 分析器,我看到大部分堆都被 OracleParameter 对象占用。

我阅读了一些关于整个 OracleCommand 和 OracleParameter 类的内容,并在每个使用 OracleParameters 的 try 块的末尾添加了处理函数。我还尝试完全按照此处所示进行处理,但结果相同。

每个函数都类似于以下内容:

OracleCommand oraCmd = null;
            try
            {
                oraCmd = GetCommand();
                oraCmd.CommandText = "PKG_TASK_MGR." + commandName;
                oraCmd.CommandType = CommandType.StoredProcedure;
                oraCmd.Parameters.Add("retVal", OracleDbType.Int16, ParameterDirection.ReturnValue);
                oraCmd.Parameters.Add("TASK_RESOURCE_ID", OracleDbType.Varchar2, ParameterDirection.Input);
                oraCmd.Parameters["TASK_RESOURCE_ID"].Value = task.ResourceId;
                oraCmd.Parameters.Add("TASK_DATA", OracleDbType.XmlType, ParameterDirection.Input);
                oraCmd.Parameters["TASK_DATA"].Value = xmlData;
                oraCmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Logger.CreateMessage(PkgID.TASK_MGR).Error("failed to update taskdata/additional data! error:{0}", ex.Message);
                throw ex;
            }
            finally
            {
                DisposeCommand(oraCmd);
            }

DisposeCommand 如下:

private void DisposeCommand(OracleCommand oraCmd)
        {
            if (oraCmd == null)
            {
                return;
            }
            foreach (OracleParameter cmdParam in oraCmd.Parameters)
            {
                cmdParam.Dispose();
            }
            oraCmd.Parameters.Clear();
            oraCmd.Dispose();
        }

我预计下一次分析时堆中的 OracleParameter 对象会少得多,但它似乎仍然是占用内存的最大块。我错过了什么?

标签: c#oraclememorygarbage-collection

解决方案


推荐阅读