在线急求大侠指点:多线程数据库读写的时候程序访问数据库间歇性出错

wangfan12580 2011-06-07 02:04:28
错误1:不能打开数据库##。应用程序可能无法识别该数据库,或文件可能损坏

错误2:尝试打开的数据库已经被机器 #WMCCN# 上的用户 #Admin# 以排它的方式打开。当数据库可使用后请再试一次

程序测试可以正常运行,只是一段时间之后(不定时),就会引发如上所述的数据库访问错误

每次数据库访问之后,连接都是关闭了的dispose() close()

测试的数据库是临时建的,并没有创建排他锁

可能是多个线程同时访问数据库的时候造成的资源争夺错误



希望有多线程方面类似情况处理经验的大侠们速来指点一二,最好能告知这种情况最有效的处理方案

时间很紧,在线急等,谢谢








...全文
207 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangfan12580 2011-06-08
  • 打赏
  • 举报
回复
补充一点:我的所有线程读取同一个表,但是不会同时读取同一条记录,读取的目标库是GE Historian实时历史数据库

读取的时候经常不定时出现:不能打开数据库##。应用程序可能无法识别该数据库,或文件可能损坏
的错误,后面抛出的异常显示就是select数据库GE Historian中表时的错误

有大侠熟悉GE Historian数据库的否?
wangfan12580 2011-06-08
  • 打赏
  • 举报
回复
大侠大侠你在哪?!?
pretyjfh 2011-06-07
  • 打赏
  • 举报
回复
帮忙顶
wangfan12580 2011-06-07
  • 打赏
  • 举报
回复
没人了麽
wangfan12580 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sp1234 的回复:]

你掩盖了一个实情,你使用什么数据库?是Jet(Access)?
[/Quote]

数据导出端:GE Historian实时历史数据库,提供OLEDB接口

中间:XML存储Mapping配置文件及临时数据存储 导出数据到——XML——读取数据到SQLServer、Oracle

数据写入端:SQL2005本机测试,最终部署使用Oracle 10.2.0.3
  • 打赏
  • 举报
回复
如果是Jet,那么很自然。多用户访问Jet数据库文件,假设有一个连接没有关闭就断开了,数据库立刻就“坏了”,需要使用Access的文件修复工具修复了才能继续使用(但是此时往往也随机丢失了一个或者多个数据块中的多条数据记录)。Access使用的是很低级的多用户加锁模式,就是这个德行。
  • 打赏
  • 举报
回复
你掩盖了一个实情,你使用什么数据库?是Jet(Access)?
RUNBEAR 2011-06-07
  • 打赏
  • 举报
回复
lock的应该是一个静态的属性或对象。
不过弱弱地问句,300个线程,会差吗??????没试过。。
zhulong1111 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengyi_205 的回复:]
每次访问数据库都是一个新的DAL实例?
那你lock(this) 有什么用,锁定自身?

定义一个私有静态变量

private static object lockobj=new object();

lock(this) => lock(lockobj)
[/Quote] 这哥们应该可以 线程同步 使用lock锁住共同调用的方法。。。每次线程调用这方法 只有一个个的去调用
wangfan12580 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xuexiaodong2009 的回复:]

引用 3 楼 pengyi_205 的回复:

每次访问数据库都是一个新的DAL实例?
那你lock(this) 有什么用,锁定自身?

定义一个私有静态变量

private static object lockobj=new object();

lock(this) => lock(lockobj)
同意,有必要使用lock吗
[/Quote]

同时开启300个左右的线程读写数据库、读写XML文件,如果不lock的话
错误1:不能打开数据库##。应用程序可能无法识别该数据库,或文件可能损坏

错误2:尝试打开的数据库已经被机器 #WMCCN# 上的用户 #Admin# 以排它的方式打开。当数据库可使用后请再试一次

错误3:文件“XX”不能使用

上述几个数据库、XML文件读写错误可以如何避免?

xuexiaodong2009 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengyi_205 的回复:]

每次访问数据库都是一个新的DAL实例?
那你lock(this) 有什么用,锁定自身?

定义一个私有静态变量

private static object lockobj=new object();

lock(this) => lock(lockobj)
[/Quote]同意,有必要使用lock吗
wangfan12580 2011-06-07
  • 打赏
  • 举报
回复
嗯,多谢楼上
夺命胖子 2011-06-07
  • 打赏
  • 举报
回复
对于不同对象,锁定的标志对象(也就是上面的lockobj)相对于它们要是同一个,这样才能保证不会同一时间多个对象执行该代码段
夺命胖子 2011-06-07
  • 打赏
  • 举报
回复
每次访问数据库都是一个新的DAL实例?
那你lock(this) 有什么用,锁定自身?

定义一个私有静态变量

private static object lockobj=new object();

lock(this) => lock(lockobj)

qydvip 2011-06-07
  • 打赏
  • 举报
回复
友情帮顶......
wangfan12580 2011-06-07
  • 打赏
  • 举报
回复
我这边程序需要同时开启300个左右的线程从数据库A读取数据并写入数据到XML,然后读取XML数据再写入到数据库B中,我这读写数据库的代码部分加上Lock能不能解决这个问题?
如:
lock (this)
{
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
OleDbDataAdapter oleddbDA = new OleDbDataAdapter(sqlStr, conn);
DataSet ds = new DataSet();
oleddbDA.Fill(ds);
conn.Open();
MESTrace.Trace("Execute SQL: " + sqlStr);
if (ds.Tables.Count > 0)
dt = ds.Tables[0];
MESTrace.Trace(sqlStr + " Return " + dt.Rows.Count);

oleddbDA.Dispose();
conn.Dispose();
conn.Close();
}
return dt;
}


急求大侠帮忙

62,266

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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