Это мой первый взлом метода, который периодически запускается в течение срока службы моего приложения 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;
}