如果您确定保留最后一个引用的是 SqlParameter,您可以做几件事。
首先,尝试将您的 XML 作为字符串传递(并在存储过程中使用 OPENXML 来处理它),看看是否有一个简单的对象和更多的控制会有所帮助。
其次,制作自己的 SqlParameter-s,将它们保存在 Dictionary 中,然后执行以下操作:
foreach (SqlParameter param in parameters.Values)
command.Parameters.Add(param);
然后在完成命令运行并处理命令并关闭(如果仍然打开)并处理连接后,进入字典,将 null 显式分配为 SqlParameter.Value (或者,将字符串 ref 从 .Value 获取到本地 var,将 String.Empty 分配给 .Value,然后将 null 分配给本地 var - 仅当 SqlParameter.Value 抱怨直接为 null 时。然后将 null 分配给字典项(即 SqlParameter 的引用),然后将 null 分配给字典。
在更简单的情况下,您可以只保留一个关键 SqlParameter 的引用并跳过字典。关键是要保持显式分配空值- 字符串的最后一个引用,然后是包含它的 SqlParameter 的最后一个引用。
请记住,这涉及到几件事。它从根本不解析中间层的 XML 开始 - 只是将其发送到 SQL 并以显式取消引用结束。如果您的代码实际上是在动态构建 XML,请将其设为一个大的直字符串来尝试。
如果仅此一项并不能降低内存压力,那么您将不得不强制执行显式 GC 收集,但为此您必须做一些阅读并计划合理的时间间隔,因为 GC 成本很高,即如果您在每次请求后启动 GC-in就像一只疯狂的兔子一样,您将在 CPU 周期上付出很多。
Also since you didn't say how big you data actually is and on what kind of hardware are you running and if your mid tier running under IIS it's hard to speculate about possible further options, like to have IIS run multiple worker processes and just recycle them when they get too bloated. For really huge memory consumption and genuine pass-through mid-tier (meaning no cache buildups) that can be faster than fiddling with gc but we are talking really huge data in order to enter that area.