1

我在标准 C# windows 窗体应用程序中使用 SQL Server 2008 Express 数据库编写了自定义复制功能。它基本上拉下一组需要针对订阅者数据库执行的 sql 语句。在完全刷新时,这可以运行多达 200k+ 条需要执行的语句。

我在代码块中处理这些语句,如下所示:

using (SqlConnection connection = ConnectionManager.GetConnection())
{
     connection.Open();

     SqlTransaction transaction = connection.BeginTransaction();

     // Process 200k+ Insert/Update/Delete statements using SqlCommands

     transaction.Commit
}

我发现,对于前 30k 条语句,我的应用程序内存使用量保持在 40mb 左右,相当稳定。之后它似乎突然跳到 300mb 左右,然后增长,直到我遇到 OutOfMemory 异常。

我使用的方法是否可行,我可以在单个事务中处理那么多语句吗?我认为我应该能够做到这一点。如果有更好的方法,我很乐意来这里。我需要这是事务性的,否则部分复制会导致数据库损坏。

谢谢。

编辑:

重新启动计算机后,我设法完成了完整的 200k+ 复制。尽管在复制完成后内存使用量曾一度增长到 1.4Gb,但内存使用量一直下降到 40mb。这使我得出结论,我的循环中处理命令的某些东西可能会导致内存增长。

4

1 回答 1

4

你是你Disposing的表格和关闭前的一次性控件吗?

将所有 Disposable 对象包装在 Using 语句中。点击这里查看更多详情


不要一遍又一遍地打开/关闭连接,而是在单个事务中将数据发送到数据库。点击这里查看更多详情


仍然您的应用程序占用太多内存,那么您需要像 Red Gate Ants Memory Profiler 这样的 Doctor。单击此处查看有关它的更多详细信息

在此处输入图像描述


我可以在一个事务中处理那么多语句吗?

您有以下选项可以执行此操作...

  1. 批量插入和操作Stored Proc.
  2. 准备XML并发送字符串Database
  3. DataTable通过 Stored Proc 在 Sql Server 中发送只读

样本存储过程

Begin Try
    Set NoCount ON
    Set XACT_Abort ON
    Begin TRan
        --Your queries
    Commit Tran

Begin Tran

Begin Catch
    Rollback Tran
End Catch

确保Dispose物品一旦不使用。


应该是这样的

using (SqlConnection connection = new SqlConnection())
{
    connection.Open();
    using (SqlTransaction transaction = connection.BeginTransaction())
    {
        transaction.Commit();
    }
}

你也验证了SqlCommand吗?

using (SqlCommand cmd = new SqlCommand())
{
}
于 2012-07-26T18:21:46.383 回答