首页 新闻 会员 周边 捐助

这种写法在并发情况下有无问题?

0
悬赏园豆:50 [已解决问题] 解决于 2014-02-17 14:31

比如我有个 sqlhelper对象,是个动态类,含动态方法,每次调用都需要实例化

sqlhelper helper = new sqlhelper(connectionstring);...

因为每个页面基本都会用到,为了调用方便,我干脆定义一个类如 GlobalObject,类下面定义一个静态的sqlhelper成员变量,如

public class GlobalObject

{

  public static readonly helper = new sqlhelper(connectionstring);...

}

于是各个页面就这样直接调用sqlhelper的方法

GlobalObject.helper.executesql(sql)...;

 

由于iis的应用池时不时的出现假死情况,要回收一下才正常,看内存和cpu的资源占用也很低,所以有点怀疑这中写法是不是有问题导致的。

 

lindping的主页 lindping | 初学一级 | 园豆:3
提问于:2014-02-17 01:30
< >
分享
最佳答案
0

你这样实现,还不如把sqlhelper改成静态类。

静态方法是线程安全的

收获园豆:40
dudu | 高人七级 |园豆:30778 | 2014-02-17 10:06
其他回答(4)
0

含动态方法,每次调用都需要实例化.

然后用单例?你这个Helper每次调用需要重新实例化吗?

吴瑞祥 | 园豆:29449 (高人七级) | 2014-02-17 08:42

是的。

支持(0) 反对(0) lindping | 园豆:3 (初学一级) | 2014-02-17 09:52
0

如果你的 slqhelper 是有状态的对象,那么你这种写法就有可能有问题。

收获园豆:5
Launcher | 园豆:45050 (高人七级) | 2014-02-17 09:16
0

将Sqlhelper类改成单例

收获园豆:5
cenlo | 园豆:583 (小虾三级) | 2014-02-17 10:04
0

有很大的问题, 数据库连接线程打开却没关闭,这样是很浪费资源的。

加上线程池能同时打开的连接线程数有限制,所以,这样并发一多,就会出现的说的假死。

建议做法,使用后即时关闭SqlConnection 的连接

Jerry柯 | 园豆:496 (菜鸟二级) | 2014-02-17 10:14

 new sqlhelper(connectionstring) 的时候并非是open一个conn,只是把connectionstring传进去而已,具体方法executesql执行的时候是实时打开和关闭的

pubulic  void executesql(string sql)

{

    using(sqlconnection conn = new sqlconnection(connectionstring))

   { ... }

}

支持(0) 反对(0) lindping | 园豆:3 (初学一级) | 2014-02-17 11:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册