下面一段程序中
public static DataSet web_39_checkuser(string phs, ref int if_true, out int returnValue)
{
SqlConnection oConn = new SqlConnection(strconn);
returnValue = 0;
SqlDataAdapter oAdp = new SqlDataAdapter("web_sms.web_39_checkuser", oConn);
oAdp.SelectCommand.CommandType = CommandType.StoredProcedure; SqlParameter[] arParms = new SqlParameter[2];
arParms[0] = new SqlParameter("@phs", SqlDbType.VarChar, 11 );
arParms[0].Value = phs;
arParms[1] = new SqlParameter("@if_true", SqlDbType.Int, 1 );
arParms[1].Direction = ParameterDirection.Output; foreach(SqlParameter p in arParms)
oAdp.SelectCommand.Parameters.Add(p); DataSet oDs = new DataSet();
oConn.Open();
try
{
oAdp.Fill(oDs);
}
catch
{
returnValue = 1;
}
try
{
if_true = Int32.Parse( arParms[1].Value.ToString());
}
catch
{
returnValue = 1;
} oConn.Close();
return oDs;
}
这段程序用静态方法实现了数据库操作,作者解释是为了避免产生多个连接实例,因为之前出现过ASP。NET要求SQL SERVER 连接数目太多而被拒绝。采用此方法后问题解决了。但是我想这样就不允许多线程,只允许每个线程顺序访问,假设每个连接都耗时较长,那么数据库操作不就相当慢?请高手解答我的疑问,谢谢!

解决方案 »

  1.   

    asp.net对数据库采取的是断开式数据连接,意思就是访问好了马上断开,所以每个连接的耗是都非常短看最后的两行代码:
    oConn.Close();//关闭连接
    return oDs;//将所需要的数据集记录到服务器内存中并返回如果不用静态方法就这样:
    oConn.Close();//关闭连接
    oConn=null;//清除连接实例
    return oDs;//将所需要的数据集记录到服务器内存中并返回
      

  2.   

    不需要用static
    因为ado.net是用连接池
      

  3.   

    如果是静态的 那么每个用户访问都会使用此dataset 也就是说第1个用完了后 第2个还会改变这个dataset 会不会混乱
      

  4.   

    大家看看SqlHelper的ExecuteDataSet方法也是静态的,返回值也是DataSet,所以这样用应该没问题的。
      

  5.   

    static方法与常规方法不同的是static方法没有依赖对象,就是说它一直在内存里,
    而常规方法必须先创建一个对象。至于方法内部的代码是否是单线程的,与static无关。就是说static比常规方法少了一个对象的创建过程,仅此而已。
      

  6.   

    没问题的。SqlHelper中的方法全是静态方法
      

  7.   

    给你贴上思归给我得回答
    从表面上看,静态(static)成员可以通过 类名.成员名 来直接调用,而实例(instance)成员需要生成一个对象后才能调用。同一个操作,性能当然静态成员好但其实区别是跟对象设计有关的,一般来说实例成员跟实例的状态有关,某个方法的调用可能需要访问当前对象的状态,并改变其状态,从而影响其他方法的结果而静态成员是跟类本身有关,与单独的实例状态无关。但静态成员不要太多了,否则就沦为以前的procedural programming风格了,也许对象需要重新设计或重构。静态成员往往会在多线程下操作,需要做同步化控制
      

  8.   

    好帖,正有这方面的疑惑
    http://community.csdn.net/Expert/topic/3400/3400778.xml?temp=.2661707
    刚发帖询问过
      

  9.   

    比如用静态方法返回DataTable内存中就有5条记录,如果下次再有用户执行此静态方法,肯定还是5条记录,因为它只有一个副本,如果不是静态方法,再一次请求,要new一个实例,开辟新的内存空间,就应该是5*2=10条记录,这样看来,静态方法不是应该更合理呢,挺疑惑,请高手继续指点