比如我有个 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的资源占用也很低,所以有点怀疑这中写法是不是有问题导致的。
你这样实现,还不如把sqlhelper改成静态类。
静态方法是线程安全的
含动态方法,每次调用都需要实例化.
然后用单例?你这个Helper每次调用需要重新实例化吗?
是的。
如果你的 slqhelper 是有状态的对象,那么你这种写法就有可能有问题。
将Sqlhelper类改成单例
有很大的问题, 数据库连接线程打开却没关闭,这样是很浪费资源的。
加上线程池能同时打开的连接线程数有限制,所以,这样并发一多,就会出现的说的假死。
建议做法,使用后即时关闭SqlConnection 的连接
new sqlhelper(connectionstring) 的时候并非是open一个conn,只是把connectionstring传进去而已,具体方法executesql执行的时候是实时打开和关闭的
pubulic void executesql(string sql)
{
using(sqlconnection conn = new sqlconnection(connectionstring))
{ ... }
}