2012-06-05 15 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