1

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例外が発生するまで大きくなります。

私が使用している方法は可能ですか?1つのトランザクション内でその多くのステートメントを処理できますか?私はこれができるはずだと思います。もっと良い方法があれば、ここに行きたいです。これはトランザクションである必要があります。そうしないと、部分的なレプリケーションによってデータベースが破損します。

ありがとう。

編集:

コンピューターを再起動した後、200k以上の完全なレプリケーションを実行することができました。レプリケーションが完了した後、ある時点でメモリ使用量が1.4Gbに増加しましたが、メモリ使用量は40MBにまで低下しました。これにより、コマンドを処理するループ内の何かが、おそらくメモリの増加を引き起こしていると結論付けることができます。

4

1 に答える 1

4

あなたDisposingは閉じる前にあなたのフォームと使い捨てのコントロールですか?

UsingStatementですべての使い捨てオブジェクトをラップします。詳細はこちら


接続を何度も開いたり閉じたりしないでください。代わりに、単一のトランザクションでデータをデータベースに送信してください。詳細はこちら


それでも、アプリケーションが保持しているメモリが多すぎる場合は、Red Gate AntsMemoryProfilerのような医師が必要です。詳細については、ここをクリックしてください

ここに画像の説明を入力してください


1つのトランザクション内でその数のステートメントを処理できますか?

これを行うには、以下のオプションがあります...

  1. のレコードを一括挿入して操作しStored Procます。
  2. 文字列を準備XMLして送信しますDatabase
  3. DataTableストアドプロシージャを介してSQLServerで読み取り専用を送信します

サンプルストアドプロシージャ

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 に答える