使用SqlTransaction处理数千个SqlCommands会导致内存异常

时间:2012-07-26 18:12:03

标签: c# sql-server out-of-memory sqltransaction

我在带有SQL Server 2008 Express数据库的标准C#windows窗体应用程序中编写了自定义复制功能。它基本上下拉了一组需要针对订阅者数据库执行的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 +的完整复制。尽管在复制完成后,内存使用量一直在增加,但内存使用率却一直下降到40mb。这让我得出结论,我的循环内部处理命令的东西可能导致内存增长。

1 个答案:

答案 0 :(得分:4)

关闭之前,您是Disposing表格和一次性控件吗?

Wrap all Disposable objects in Using Statement. Click here for more details


Don't open/close the Connection over and over again, instead send the data to database in single Transaction. Click here for more details


Still your application is holding tooo much memory then you need a Doctor like Red Gate Ants Memory Profiler. Click here to see more details about it

enter image description here


  

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

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

  1. 批量插入并操作Stored Proc中的记录。
  2. 准备XML并在Database
  3. 中发送字符串
  4. 通过存储过程发送Sql Server中的只读DataTable
  5. 样本存储过程

    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())
    {
    }