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

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



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

请问有没有办法能够避免这种情况发生,比如避免两个线程同时操作数据库。LOCK关键字可以锁定变量,不知道对数据库行不行?
...全文
330 点赞 收藏 5
写回复
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)这个是参考资料。
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告