我在VS2010中建立了一个使用MVC3(Razor)的网站
我使用DBContexts访问数据库,我的连接字符串是:
<add name="SystemDBContext"
connectionString="Data Source=|DataDirectory|System.sdf"
providerName="System.Data.SqlServerCe.4.0" />
我想要一个游戏循环,所以我在Application_Start中启动了一个新线程,它使用DBContext循环和访问数据库。
似乎正在发生的是循环使用DBContext并锁定db文件,然后每当您尝试从网站本身的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 :(得分:4)
似乎正在发生的是循环使用DBContext并锁定db文件,然后 每当您尝试从网站本身的DBContext进行更改时,该文件都在使用中。
回到阅读文档?它说WinCE的部分不是多线程的服务器。请改用SQL Server - Express is free。 CE用于有限的可伸缩性项目,单线程访问。
这样做的最佳做法是什么?
使用正确的数据库服务器。 CE非常有问题,特别是如果你一直启动/停止数据库引擎,这会导致很多低效的光盘访问。
SQL Server正是为此完成的,正如我所说的 - Express很便宜。