在线急求大侠指点:多线程数据库读写的时候程序访问数据库间歇性出错 本帖最后由 wangfan12580 于 2011-06-07 14:05:18 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我这边程序需要同时开启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; }急求大侠帮忙 每次访问数据库都是一个新的DAL实例?那你lock(this) 有什么用,锁定自身?定义一个私有静态变量private static object lockobj=new object();lock(this) => lock(lockobj) 对于不同对象,锁定的标志对象(也就是上面的lockobj)相对于它们要是同一个,这样才能保证不会同一时间多个对象执行该代码段 同时开启300个左右的线程读写数据库、读写XML文件,如果不lock的话错误1:不能打开数据库##。应用程序可能无法识别该数据库,或文件可能损坏错误2:尝试打开的数据库已经被机器 #WMCCN# 上的用户 #Admin# 以排它的方式打开。当数据库可使用后请再试一次错误3:文件“XX”不能使用上述几个数据库、XML文件读写错误可以如何避免? 这哥们应该可以 线程同步 使用lock锁住共同调用的方法每次线程调用这方法 只有一个个的去调用 lock的应该是一个静态的属性或对象。不过弱弱地问句,300个线程,会差吗??????没试过。。 你掩盖了一个实情,你使用什么数据库?是Jet(Access)? 如果是Jet,那么很自然。多用户访问Jet数据库文件,假设有一个连接没有关闭就断开了,数据库立刻就“坏了”,需要使用Access的文件修复工具修复了才能继续使用(但是此时往往也随机丢失了一个或者多个数据块中的多条数据记录)。Access使用的是很低级的多用户加锁模式,就是这个德行。 数据导出端:GE Historian实时历史数据库,提供OLEDB接口中间:XML存储Mapping配置文件及临时数据存储 导出数据到——XML——读取数据到SQLServer、Oracle数据写入端:SQL2005本机测试,最终部署使用Oracle 10.2.0.3 补充一点:我的所有线程读取同一个表,但是不会同时读取同一条记录,读取的目标库是GE Historian实时历史数据库读取的时候经常不定时出现:不能打开数据库##。应用程序可能无法识别该数据库,或文件可能损坏的错误,后面抛出的异常显示就是select数据库GE Historian中表时的错误有大侠熟悉GE Historian数据库的否? .net html导出.odt文件 请问 WCF DataContract 类,其 method 被客户端调用问题 DropDownList在后台怎么邦定数据来着,符代码谢谢。 老规矩,升星散分~ 下载一个文件的同时去更新数据库 送100分给大家,希望自己的病好起来! 页面刷新的产生的声音? 如何用ASP.NET调用一个用C#写的DLL文件 .net web发布后,部分文件未同时发布 鄙人初到武汉,哪位朋友能告诉我有没有招b/s或web开发的公司呢? 如果这个jquery自动放映,应该添加哪句代码?? 急求 asp.net问题 100分哈
如: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;
}急求大侠帮忙
那你lock(this) 有什么用,锁定自身?定义一个私有静态变量private static object lockobj=new object();lock(this) => lock(lockobj)
同时开启300个左右的线程读写数据库、读写XML文件,如果不lock的话
错误1:不能打开数据库##。应用程序可能无法识别该数据库,或文件可能损坏错误2:尝试打开的数据库已经被机器 #WMCCN# 上的用户 #Admin# 以排它的方式打开。当数据库可使用后请再试一次错误3:文件“XX”不能使用上述几个数据库、XML文件读写错误可以如何避免?
不过弱弱地问句,300个线程,会差吗??????没试过。。
数据导出端:GE Historian实时历史数据库,提供OLEDB接口中间:XML存储Mapping配置文件及临时数据存储 导出数据到——XML——读取数据到SQLServer、Oracle数据写入端:SQL2005本机测试,最终部署使用Oracle 10.2.0.3
的错误,后面抛出的异常显示就是select数据库GE Historian中表时的错误有大侠熟悉GE Historian数据库的否?