访问 SQL CE 数据库的线程安全方式

Posted

技术标签:

【中文标题】访问 SQL CE 数据库的线程安全方式【英文标题】:Thread Safe way to access SQL CE Database 【发布时间】:2012-02-08 15:06:13 【问题描述】:

背景:

在我的 windows phone 项目中。我使用本地 SQL CE 数据库来存储日期。使用 LINQ to SQL 以编程方式创建数据库表。

通过几个线程中的各种数据上下文实例访问该数据库。

问题来了:

我为我的应用程序的用户提供了删除所有数据和注销的选项。当用户选择它时,我使用 datacontext 的 DeleteDatabase 方法删除数据库。但是,我总是收到数据库正在被另一个进程使用的错误,因此无法删除。

任何朝着正确方向的轻推都会让我开心。

【问题讨论】:

当您调用 Delete DB 时,您是否还有任何连接处于打开状态?最有可能是您的进程可以访问数据库而不是其他东西。 好吧,我关闭了所有我知道可以打开的连接。有没有办法获取正在使用数据库的进程并杀死它们? 您是否将 DataContext 的所有实例包装在 using 语句中和/或处置它们? @ErikEj 感谢您指出这一点。我忽略了一个没有使用“使用”语句的实例。改变它解决了这个问题。就像我说你让我开心:) 【参考方案1】:

如上所述,安迪(老实说,他们打败了我)问题是在另一个进程仍然打开连接时访问数据库。基本上,可以通过将针对数据库运行的任何代码放在 using 块中来轻松修复,如下所示:

using (MyDataContext db = new MyDataContext("isostore:/MyData.sdf"))

    //Run database logic here

我想从某种意义上说,它对错误很有意义。在 WP7 中打开的文件也会发生同样的情况。

有关更多信息和示例,请查看此page。

【讨论】:

嗨,我试过这种方式,我的意思是我在任何地方都使用了 using 块,但是当我试图删除数据库时它仍然给我错误。

以上是关于访问 SQL CE 数据库的线程安全方式的主要内容,如果未能解决你的问题,请参考以下文章

CoreData和SQLite多线程访问时的线程安全问题

如何创建线程?如何保证线程安全?

并发线程安全性

使用 django 访问数据库的线程安全方法

创建线程的3种方式。什么是线程安全。

5线程安全的实现方式