我在带有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。这让我得出结论,我的循环内部处理命令的东西可能导致内存增长。
答案 0 :(得分:4)
关闭之前,您是Disposing
表格和一次性控件吗?
我可以在单个事务中处理那么多语句吗?
您有以下选项可以执行此操作...
Stored Proc
中的记录。XML
并在Database
。DataTable
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())
{
}