多线程使用一个全局静态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)
{
//要如何实现?
}

或者有其他什么解决方案。
...全文
190 点赞 收藏 9
写回复
9 条回复
阳泉酒家小当家 2014年01月27日
引用 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日
每个连接一个方法,应该不会有问题的啊。
回复 点赞
阳泉酒家小当家 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相关的
回复 点赞
发动态
发帖子
疑难问题
创建于2007-09-28

9308

社区成员

12.1w+

社区内容

MS-SQL Server 疑难问题
社区公告
暂无公告