在编程中。
如果自己封装了 SQLHELPER 。那么最“合适”的方法是什么?我想请问下:成千上万个用户中,假设A、B、C个用户同时访问页面,同时操作了同一个步骤。假设都操作了向数据库添加一条记录(这里不考虑数据库并发)。
那么,我们是要采用【需要时】,还是【永久时】?1、【永久时】会不会引发异常?倘若【添加一条记录】不会引发异常。2、那么多个用户同时进行 ExecuteReader 呢?(一个数据源只能同时拥有一个读取器
发现自己有太多不了解了。达人,告诉我好吗?

解决方案 »

  1.   

    new的时候会从连接池中取或分配连接,因此并发时
    使用这种方法较好
      

  2.   

    也就是说,当需要时,New 一个过来,对么?
      

  3.   

    new千万不要静态。因为你已经想到了并发。那么如果系统扩大当你考虑多线程时你就不得不改为new。记得在你写构造函数的时候,就顺手把你的析构函数给写好。在你创建对象实例时就想好什么时候销毁它。这样,程序就不会有问题了。一般静态方法只有在A a = new A();A b = new A();A.fun(a,b)这类情况下才会考虑。
      

  4.   

    搭车同问。我自己写的数据库操作类用了单实例模式。
    这样会出现楼主说的问题吗?
    public Class SqlOperator
    {
        private SqlOperator instance = new SqlOperator();
        public SqlOperator Instance
        {
            get
            {
                return instance;
            }
        }    priavte string connectionString = "***";
        
        public SqlDataReader Runsql(string sql)
        {
            SqlConnection conn = new SqlConnection(connectionString);
            ......
            return **;
        }
    }
      

  5.   

    接上面的,调用这个类的时候。
        string sql = "select * from ..."; 
        SqlDataReader reader = SqlOperator.Instance.RunSql(sql);
      

  6.   

    To 9
    感觉上个不会。你的单例只是 SqlOperator。我想到一个更好的方法。当千万人来茅坑,来一个我给挖一个,来一个我挖一个……但我把Connection 存放在 Sesstion 里,当发现会话里存有数据源,直接用之前保存的。这样的效果减免实例化的次数,毕竟不大可能,一个人双脚踏双坑。不知这样是否具有可行性?
      

  7.   

    public override IDbConnection CreateConnection()
            {
                SqlConnection conn = null;
                var p = Web.VPage.Current;
                if (!p.IsNull() && !p.Session[TempConnectionKey].IsNull())
                {
                    conn = p.Session[TempConnectionKey] as SqlConnection;
                    if (!conn.IsNull()) return conn;
                }
                VCore.WriteToDebug("创建了一个数据源。");
                conn = new SqlConnection(this._connectionString);
                if (!p.IsNull()) p.Session[TempConnectionKey] = conn;
                return conn;
            }示意代码。
      

  8.   


    挖茅坑很费时费力的,而且1.受资源(如地皮)限制,挖不了那么多
    2.没那么大需求,挖一大批放着就是浪费这些问题,ADO.NET都考虑好了。准备了一批冲水马桶(连接池),用完了赶紧冲水滚蛋(连接放回连接池),其他人好用;
    而且有超时机制,霸着马桶不出来,对不起,您超时了(别站着茅坑不拉屎);
    如果全满了,对不起,请另找位置(报错:超过最大连接数);
      

  9.   

    你的问题在于业务需求。
    如果你的业务处理快,即使使用同一个连接,也能及时响应,那么应该重复利用同一个连接。节省连接数与建立连接的时间。如果你的业务处理放在SQL服务器上,SQL服务器已经非常繁忙,这个时候即使你开一万个链接还不是得排队等着。
    业务是系统的核心,无论什么技术手段还不是为业务服务,抛开业务空谈什么时候技术策略那是纸上谈兵。
      

  10.   

    按需分配,只要有一个人执行完毕,那么SQL连接就应该关闭,毕竟SQL连接最多连接数是有限的。
    我自己也写了个SQL底层类,使用的方法就是执行完一条SQL语句就立即关闭连接,除非操作多表,并使用了事务,那么在完成前连接必须一直占用。