2012-06-05 58 views
1

我有一個網站,我已經建立,其中使用MVC3(剃刀)VS2010的DbContext多線程

我用DBContexts訪問datbase,我的連接字符串是:

<add name="SystemDBContext" 
connectionString="Data Source=|DataDirectory|System.sdf" 
providerName="System.Data.SqlServerCe.4.0" /> 

我想有一個遊戲循環,所以我在Application_Start中啓動了一個新線程,它使用DBContext循環訪問數據庫。

什麼似乎是發生的是,循環使用的DbContext並鎖定數據庫文件,然後當你試圖使網站本身從的DbContext變化,該文件正在使用中。

這不是當我宣佈的DbContext,它發生時,我嘗試使用的DbContext執行某種形式的搜索或更新。

這裏是我的Global.asax我的控制器之一的

protected void Application_Start() 
    { 
     ... 
     Manager m = new Manager(); 
     Thread t = new Thread(m.Start); 
     t.Start(); 
    } 

部分:

public class myController : Controller 
{ 
    private SystemDBContext db = new SystemDBContext(); 


    public ViewResult Index() 
    { 
     var engines = db.Engines.Include(e => e.state); 
     return View(engines.ToList()); 
    } 
    ... 

而且我的循環看起來是這樣的:

public class Manager 
{ 
    public void Start() 
    { 
     while (true) 
     { 
      SystemDBContext db = new SystemDBContext(); 
      var query = from ... 
     } 
     ... 

什麼是最好的做法爲了做到這一點?我一直在考慮Singletons,Locks或Synclocks,調整連接字符串以允許多重連接到數據庫文件,或讓我的循環請求一個執行更新的網頁。

任何想法?

+0

循環線程創建它的DBContext一次並掛在它上面,還是隻在需要時爲特定的工作單元創建一個?你可以在哪裏創建DBContext的代碼? – hatchet

+0

我忘了將它包含在原始文章中,我已將它放入現在。循環使用新的上下文重複數據庫。 – pcaston2

回答

4

什麼似乎是發生的是,循環使用的DbContext並鎖定數據庫文件,然後 每當你嘗試讓網站本身從的DbContext變化,該文件正在使用中。

回到閱讀文檔?它所說的WinCE部分不是多線程服務器。改用SQL Server - Express is free。 CE用於有限的可伸縮性項目,單線程訪問。

什麼是這樣做的最佳做法?

使用正確的數據庫服務器。 CE是重大問題,特別是如果您始終啓動/停止數據庫引擎,導致很多低效的光盤訪問。

SQL Server完全是這樣做的,正如我所說 - Express很便宜。

+2

注意連接字符串中的SqlServerCe.4.0。 – hatchet

+0

另外SQL Express的大小限制比CE限制性更小。 (分別爲10GB和4GB) –

+0

感謝您的快速響應。我在我的機器上安裝了SQL Express 10.0.5500,並在過去使用過它。如果我更改連接字符串,那麼CF方法應該建立數據庫,對嗎?我嘗試以下 <添加名稱= 「SystemDBContext」 的connectionString = 「數據源=本地主機;初始目錄=系統;集成安全性=真」 的providerName = 「System.Data.SqlClient的」/> 但得到了一個錯誤在運行時,它無法連接到SQL Server。 – pcaston2