多线程操作ACCESS数据库后关闭时出错,求解!急急急……

9SiR 2013-01-01 05:24:55
一个多线程程序,每个线程都要操作数据库(打开、查询、修改、关闭等),程序运行一段时间后就会出错,在VS2008调试时弹出提示:
检测到 RaceOnRCWCleanup
Message: 试图释放正在使用的 RCW。活动线程或其他线程上正在使用该 RCW。释放正在使用的 RCW 的尝试会导致损坏或数据丢失。
如图:



我想可能的情况是这样,N个线程同时运行,分别在不同的时候操作数据库,此时程序能够正常运行,一段时间后,其中两个线程同时操作数据库了,一个线程操作完试图关闭数据库时,而另一个线程正在操作数据库,因此导致错误。

请问有没有办法能够避免这种情况发生,比如避免两个线程同时操作数据库。LOCK关键字可以锁定变量,不知道对数据库行不行?
...全文
430 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
9SiR 2013-01-13
  • 打赏
  • 举报
回复
引用 3 楼 e_board 的回复:
如果你的access不大的话,不妨用dataset全部读到内存,程序结束时在保存到文件。 这样你用linq查询,很快,也不用打开关闭的麻烦
谢谢你的提示,我是这样做的:先把要入库的数据存入一个数组,当数组达到一个阀值时就开始用DATASET批量插入数据库,插入完毕再清空数组,重新开始。在线程中访问该数组的地方都lock起来防止发生冲突。效果很OK,效率极大提高!
9SiR 2013-01-02
  • 打赏
  • 举报
回复
引用 3 楼 e_board 的回复:
如果你的access不大的话,不妨用dataset全部读到内存,程序结束时在保存到文件。 这样你用linq查询,很快,也不用打开关闭的麻烦
这个办法不错,值得试一下。不过我的数据库运行时要执行数万次查询修改,大概整个任务执行后数据库体积会从1M增至100M左右。不知道会不会有问题。试一下吧。
e_board 2013-01-01
  • 打赏
  • 举报
回复
如果你的access不大的话,不妨用dataset全部读到内存,程序结束时在保存到文件。 这样你用linq查询,很快,也不用打开关闭的麻烦
9SiR 2013-01-01
  • 打赏
  • 举报
回复
引用 1 楼 MeteroaChan 的回复:
试试这个,MultipleActiveResultSets=true,可以再在同一连接上处理多个活动的结果集.(http://www.cnblogs.com/chenlivip/archive/2011/05/13/2045207.html)这个是参考资料。
MultipleActiveResultSets=true这个功能目前只支持 MS SQL SERVER 2005 及以上版本 的嘛,我是用的ACCESS数据库啊。悲催啦~~
SalivaChan 2013-01-01
  • 打赏
  • 举报
回复
试试这个,MultipleActiveResultSets=true,可以再在同一连接上处理多个活动的结果集.(http://www.cnblogs.com/chenlivip/archive/2011/05/13/2045207.html)这个是参考资料。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧