这是我第一次破解在我的 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;
}