これは、ASP.NET アプリケーションの存続期間中に定期的に実行され、データベースに保存されている期限切れのセッションをクリーンアップするメソッドの最初のクラックです。かなりうまくいっているように見えますが、私のソフトウェア エンジニアは、このコードについて「正しい」とは感じていません。数か月間 LINQ to SQL を使用してきましたが、次のコードにはあまり自信がありません。私はいくつかのことを心配しています:
次のコードは、データベースがアプリケーション内の異なるスレッドによってアクセスされている状況で安全に実行できますか? トランザクションの概念については十分に理解していますが、トランザクションを適切に使用していることを確認したいと考えています。
私のクエリはパフォーマンスの問題を引き起こしますか? それとも、この場合、この特定のテーブルのすべてのレコードを選択するのが適切でしょうか? このメソッドは 15 分ごとにしか実行されないため、短期間に何度もクエリが実行されるわけではありません。
これを行うためのより良い方法はありますか?あるというしつこい感じがあります。
コード:
/// <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;
}