多线程使用一个全局静态SQL连接

ljfblog 2014-01-26 03:19:48
多线程使用一个全局静态SQL连接conn。
自然就会时不时出现“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。”类似的错误。

想在每个线程中都加上等待代码,如:
while(!DB.IsIdle(conn))
{
if(cancel) return;
}
DB.Ex.....(conn);

这个
bool IsIdel(SqlConnection conn)
{
//要如何实现?
}

或者有其他什么解决方案。
...全文
228 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 5 楼 ljfblog 的回复:
yupeigu: 代码改动比较大啊。是不是要给每个DB.Ex....块中加try{Flag=1;...;Flag=0;}catch{Flag=0;} bool IsIdel(){return Flag == 0;} 如果我在编程上控制好了,是不是就不用加防止多线程同时修改同一对象的代码了。 不过估计也没有别的办法了吧。 DBA_Huangzj: tcmakebest: 业主要求太多的异步实时提示,异步实时检查,异步实时统计...用过单独新建连接,用完关闭,可是服务器又受不了,客户端也卡顿,后来发现,异步时用户正在录入数据,不太要求异步所需时间的快速性,由此想着用一个连接把所有事情搞定。结果出来这个问题。
我觉得就在IsIdel里写吧,先判断是否为0 ,如果是0,那么就改为1,然后return 0 ,其他的代码就不用改了。 不过这个isIdel中最好加上防止同步修改的代码。
發糞塗牆 2014-01-27
  • 打赏
  • 举报
回复
连接池可以重用,不需要彻底关闭
tcmakebest 2014-01-26
  • 打赏
  • 举报
回复
引用 6 楼 ljfblog 的回复:
DBA_Huangzj: tcmakebest: 比如,报告出具界面,用户每修改一个字段,就要异步重新统计统计数据,重新检查逻辑,点击下拉数据的时候,又要异步读取相关数据,读取出来的相关数据表还要连带逻辑检查.... 虽然关闭了,可事实是频繁地在打开和关闭着,每天有成百上千的人在出具报告,对服务器也是不小的负担。
频繁地打开和关闭时,配置大一些的连接池就好了。
ljfblog 2014-01-26
  • 打赏
  • 举报
回复
DBA_Huangzj: tcmakebest: 比如,报告出具界面,用户每修改一个字段,就要异步重新统计统计数据,重新检查逻辑,点击下拉数据的时候,又要异步读取相关数据,读取出来的相关数据表还要连带逻辑检查.... 虽然关闭了,可事实是频繁地在打开和关闭着,每天有成百上千的人在出具报告,对服务器也是不小的负担。
ljfblog 2014-01-26
  • 打赏
  • 举报
回复
yupeigu: 代码改动比较大啊。是不是要给每个DB.Ex....块中加try{Flag=1;...;Flag=0;}catch{Flag=0;} bool IsIdel(){return Flag == 0;} 如果我在编程上控制好了,是不是就不用加防止多线程同时修改同一对象的代码了。 不过估计也没有别的办法了吧。 DBA_Huangzj: tcmakebest: 业主要求太多的异步实时提示,异步实时检查,异步实时统计...用过单独新建连接,用完关闭,可是服务器又受不了,客户端也卡顿,后来发现,异步时用户正在录入数据,不太要求异步所需时间的快速性,由此想着用一个连接把所有事情搞定。结果出来这个问题。
tcmakebest 2014-01-26
  • 打赏
  • 举报
回复
楼主是怎么想的,何须用如此代码自虐? 每个线程一个连接才是正常人的想法,最好是一个事务一个连接, 如果不用事务,每调用一次数据操作就生成一个连接来用,用完关闭。完毕!
發糞塗牆 2014-01-26
  • 打赏
  • 举报
回复
每个连接一个方法,应该不会有问题的啊。
  • 打赏
  • 举报
回复
引用 1 楼 ljfblog 的回复:
考虑到效率,不想通过try...catch实现 conn.Statie==ConnectionState.Open时是可以有DataReader相关的
这个我觉得,就定义一个全局变量,比如bFlag 初始值为0,每次有线程打开这个连接的时候就为1, 不过为了线程间不相互影响,要加上线程同步的代码: 比如: if bFlag == 0 那么: Monitor.Enter(this); //say we do something here. b_flag = 1; Monitor.Exit(this); else 等待一会。 然后,每次调用IsIdle就可以了
ljfblog 2014-01-26
  • 打赏
  • 举报
回复
考虑到效率,不想通过try...catch实现 conn.Statie==ConnectionState.Open时是可以有DataReader相关的

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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