2

これは、ASP.NET アプリケーションの存続期間中に定期的に実行され、データベースに保存されている期限切れのセッションをクリーンアップするメソッドの最初のクラックです。かなりうまくいっているように見えますが、私のソフトウェア エンジニアは、このコードについて「正しい」とは感じていません。数か月間 LINQ to SQL を使用してきましたが、次のコードにはあまり自信がありません。私はいくつかのことを心配しています:

  1. 次のコードは、データベースがアプリケーション内の異なるスレッドによってアクセスされている状況で安全に実行できますか? トランザクションの概念については十分に理解していますが、トランザクションを適切に使用していることを確認したいと考えています。

  2. 私のクエリはパフォーマンスの問題を引き起こしますか? それとも、この場合、この特定のテーブルのすべてのレコードを選択するのが適切でしょうか? このメソッドは 15 分ごとにしか実行されないため、短期間に何度もクエリが実行されるわけではありません。

  3. これを行うためのより良い方法はありますか?あるというしつこい感じがあります。

コード:

/// <summary>
/// Method, run periodically, to remove all sign in records that correspond to expired sessions.
/// </summary>
/// <param name="connectionString">Database connection string</param>
/// <returns>Number of expired sign in records removed</returns>
public static int Clean(String connectionString)
{
    MyDatabaseDataContext db = new MyDatabaseDataContext(connectionString);

    var signIns = db.SignIns.Select(x => x);
    int removeCount = 0;

    using (TransactionScope scope = new TransactionScope())
    {
        foreach (SignIn signIn in signIns)
        {
            DateTime currentTime = DateTime.Now;
            TimeSpan span = currentTime.Subtract(signIn.LastActivityTime);

            if (span.Minutes > 10)
            {
                db.SignIns.DeleteOnSubmit(signIn);
                ++removeCount;
            }
        }

        db.SubmitChanges();
        scope.Complete();
    }

    return removeCount;
}
4

4 に答える 4

7

これは、sproc で簡単に実行できるように思えます。SQLServer は、現在の時刻を返す GETDATE() メソッドを提供します...なぜできないのかわかりません

 DELETE * FROM tblSignIns 
 WHERE LastActivityTime < DATEADD("minute", -10, GETDATE());

それは同じことをしませんか?

于 2008-11-19T14:28:04.827 に答える
2

1 つのコメント: したくないTimeSpan.Minutes、したいTimeSpan.TotalMinutesほとんどの場合は無関係かもしれませんが、少なくとも論理的なバグです:)

于 2008-11-19T14:29:53.420 に答える
1

FWIW 少し前に、Linq のセットベース/バッチ更新 (レコード単位ではなく単一ステートメント更新) の実装を示すサンプル コードを公開しました。

私は同じものの削除バージョンを公開していませんが、すぐに公開します (読んでください: 別のブログエントリを入力したい気分になったら :) )。一方、「update」ステートメントのバージョンから派生させることができます。

説明とソース コードは、http: //blog.huagati.com/res/index.php/2008/11/05/architecture-linq-to-sql-and-set-based-operations-にあります。 更新ステートメント/

更新:「削除」の例は次の場所にあります: http://blog.huagati.com/res/index.php/2008/11/25/architecture-linq-to-sql-and-set-based-operations-削除ステートメント/

于 2008-11-25T02:39:51.243 に答える
1

データベース コンテキストのメソッドとしてストアド プロシージャを使用できます。あなたが望むことをするものを書いて、あなたのコンテキストを通してそれを呼び出してみませんか? そうすれば、コレクションを反復処理するのではなく、セット ロジックを利用することもできます。(Linq to SQL はこれをコンパイルして削除する可能性があります。削除をどのように処理するかはわかりません。)

于 2008-11-19T14:25:42.773 に答える