c# - 如何处理 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 对象会少得多,但它似乎仍然是占用内存的最大块。我错过了什么?
解决方案
推荐阅读
- git - 全部不同步时如何同步 Git 和 Github 分支
- react-native - React native reanimated useAnimatedStyle 不断向我吐口水
- r - 如何将变量传递给与数据框列同名的“with”函数?
- c++ - 如何在 C++11 中创建一系列索引的迭代器?
- postgresql - EXCEPTION 子句在 Postgresql 12 中无法正常工作
- cmd - 如何获取 .cmd 文件中的当前路径?
- pandas - 如何从两个索引号之间的数据框中打印行
- reactjs - 如何将此useffect更改为react native中的类组件?
- node.js - 无法将 npm 包发布到 GitHub 包
- sql - 将共享相同主键的 2 个值插入表中?