2008-11-19 52 views
2

這是我第一次在我的ASP.NET應用程序的生命週期中定期運行的一個方法,以清理存儲在我的數據庫中的過期會話。它似乎工作得很好,但我的軟件工程師並不覺得這個代碼「正確」。我已經使用LINQ to SQL幾個月了,但我對以下代碼不太自信。我擔心的幾件事情:定期從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; 
} 
+0

呼叫選擇是沒有意義的,我相信。你應該只能使用「foreach(登錄db.SignIns登錄)」 – 2008-11-19 14:31:07

+0

感謝喬恩 - 我忘了這一點。 – 2008-11-19 14:43:28

回答

7

這聽起來像是一個你可以輕鬆在存儲過程中做的事情。 SQLServer的給你一個GETDATE()方法返回當前時間......我不明白爲什麼你不能只是

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

那不是做同樣的事情?

+0

此外,使用Linq會在數據庫服務器和應用程序之間需要額外的通信,從而給系統帶來額外的開銷 – TAG 2008-11-19 14:30:02

1

你可以有一個存儲過程作爲數據庫上下文的方法,爲什麼不寫一個你想要的,然後通過你的上下文來調用它?這樣你也可以使用設置邏輯而不是迭代你的集合。 (Linq to SQL可能會將其編譯出去 - 不知道它是如何處理刪除的。)

+0

我沒有想到要這樣做。我會用Coderer建議的代碼嘗試一下。謝謝! – 2008-11-19 14:36:43

1

FWIW我發佈了一段示例代碼,稍後顯示了一個基於集合/批量更新實施Linq(單個語句更新而不是逐個記錄)。

我還沒有發佈相同的刪除版本,但很快就會做(閱讀:當我心情要鍵入另一個博客條目:))。同時你可以從'update'語句版本中派生它。

你會發現一個描述和源代碼在這裏: http://blog.huagati.com/res/index.php/2008/11/05/architecture-linq-to-sql-and-set-based-operations-update-statements/

更新:一個「刪除」的例子可以在這裏找到: http://blog.huagati.com/res/index.php/2008/11/25/architecture-linq-to-sql-and-set-based-operations-delete-statements/

相關問題