系统是B/S 结构的应用。
使用页面类来统一创建链接和关闭连接,其他页面在使用的时候集成这个页面类。
现在问题时,浏览一段时间网站以后,通过查找发现活动监视器里面出现很多睡眠的进程,测试发现是页面进行数据库读取操作以后,关闭的时候直接变成睡眠了。这样导致连接池很快就不能用了。各位高手知道什么原因吗?
查了很多资料说是链接没有关闭的问题,但是我已经在OnUnload中关掉页面中的链接了呀。是不是我这种做法有问题呢?谁给看看谢谢了。//初始化的时候创建数据链接        
protected override void OnInit(EventArgs e)
        {
            da = new DataAccess();
            da.ConnectString = this.ReadConfig("db_Connection");
            da.conn = da.getConn();
            System.Web.HttpContext.Current.Session["userid"] = 1;
            base.OnInit(e);
        }//页面结束的时候关闭连接
        protected override void OnUnload(EventArgs e)
        {
            if (da != null) da.Dispose();
            base.OnUnload(e);
        }//直接关闭连接
        public void Dispose()
        {
            conn.Close();
            conn.Dispose();
        }

解决方案 »

  1.   

    你试试在外网直接关浏览器进程进程能不能触发UNLOAD事件
      

  2.   

    conn.Close();
    是不是你这个方法放的位置不对呀????没有关闭??
      

  3.   

    不管C#的话。sqlserver 2005中出现睡眠是什么原因呢?由于打开了链接,没有关闭引起的吗?conn.open();
    select * from table ;
    select * from table2;
    conn.close();如果是这种写法的话。数据库中的链接应该是什么状态?关闭还是睡眠呢?
      

  4.   

    确定conn.Close();
                conn.Dispose();
    有执行,另.手功回收
    GC.Collect()
      

  5.   

    调试的时候,确定这2句话都执行过了。不过还是不行。加了那个gc.collect();,也不行。还是不断出现睡眠的链接。页面中的调用语句基本都是 select * from table 这种,放置到Datatable中,用来绑定到Repeater上的。
      

  6.   

    你那个   
             public void Dispose()
            {
                conn.Close();
                conn.Dispose();
            }
    是DataAccess类的成员吗?你调用了da.Dispose();方法,但是不知道你那个方法里面是否有关闭连接.
      

  7.   

    是的。执行以后,可以看到Conn的状态已经变成Closed了。
      

  8.   

    在页面关的时候才close()
    这样是不是不好哦
    我看到的很多都是要用的时候打开
    用取完数据就关了
      

  9.   


    dispose是个方法的。怎么查看是不是dispose了?不过语句执行了。没有出错的。
      

  10.   


    这是好习惯呀,呵呵dispose是个方法的。怎么查看是不是dispose了?不过语句执行了。没有出错的。
    你看它走了那个方法没有???
      

  11.   

    我本来也是这么做的。不过一个页面需要加载几次数据,如果用完就关。会导致页面反复开关多次的。
    所以才采用一个页面一次开关的办法。见鬼的事情出现了。刚刚调试的时候,发现每次连接都可以正常关闭了。代码什么的也是刚才的那些。现在就不会出现一堆连接睡眠的情况了。。
    也不知道是刚才那句修改的问题。我在找找看。有过修改的就是那个OnUnload(),等我在研究研究。
            protected override void OnUnload(EventArgs e)
            {
                if (da != null)
                {
                    da.conn.Close();
                    da.conn.Dispose();
                    GC.Collect();
                    //da.Dispose();
                }
      

  12.   

    单独写打开和关闭事件方法  每次执行那些方法时先调用打开方法执行完后关闭 这样就不容易出错了/// <summary>
            /// 根据参数方式执行sql语句返回数据第一行第一列
            /// </summary>
            /// <param name="sql">sql语句</param>
            /// <param name="sqlParameter">参数集合</param>
            /// <returns>返回dataset数据集</returns>
            public string getSomeQuery(string sql, SqlParameter[] sqlParameter)
            {
                string some = string.Empty;
                try
                {
                    Open();
                    SqlCommand sqlCommand = new SqlCommand(sql, con);
                    sqlCommand.Parameters.AddRange(sqlParameter);
                    object results = sqlCommand.ExecuteScalar();
                    if (results == null)
                    {
                        some = string.Empty;
                    }
                    else
                    {
                        some = results.ToString();
                    }
                    sqlCommand.Dispose();
                    sqlCommand.Connection.Close();
                }
                catch (Exception ex)
                {
                    some = string.Empty;
                    throw ex;                
                }
                finally
                {
                    Close();
                }
                return some;
            }        #region Connection Open and Close
            /// <summary>
            /// 关闭数据库连接
            /// </summary>
            public void Close()
            {
                if (con.State != ConnectionState.Closed)
                {
                    con.Close();
                }
            }        /// <summary>
            /// 判断打开数据库连接
            /// </summary>
            public void Open()
            {
                if (con.State == ConnectionState.Closed)
                {
                    con.Open();
                }
            }
      

  13.   

    找到原因了。
    是由于加了GC.Collect()后那些打开的睡眠链接,就都没了。
    不过这是什么原因呢?为什么用Close 和 Dispose无法消除那些睡眠的链接呢?
      

  14.   

    GC.Collect()原来你又打开呀???晕,如果有释放应该在这个过程中就不会了呀,你的这个方法里又写了连接语句??
      

  15.   

    没有,是在最后使用的Conn.close()。以后就没有别的代码了。
    不过只是使用Conn.close()和conn.dispose()的话。在数据库中还是能够看到那些链接都是睡眠状态。如果再加上GC.Collect()的话,那些个睡眠的就都没了。
    搞不懂了
      

  16.   

    楼上的兄弟们,你们如此定义的conn在finally里面能访问吗?
    正解在这呢!呵呵sqlConnection conn = null;
    try 

    if(conn == null)
    {
         sqlConnection conn=new sqlConnection(); 
         conn.connectionString="……"; 
    }
    if(con.State != ConnectionState.Open)
       conn.Open(); 
    …… 
    int a=1/0;//该行出现异常 
    //conn.close(); 

    catch(Exception ee) 

    Response.write(ee.toString()); 
    }
    finally
    {
       if(conn != null)
        {
            conn.Close();
            conn.Dispose();楼主参考一下这个方法看能不能帮到你?
      

  17.   

    楼上的压根不着边,这里就没有使用try-catch的份.
      

  18.   


    是啊,我一般使用数据库连接的时候,都是用using块的,所以都不去写什么Close方法,也没有考虑过手动去关闭,一旦需要手动去关闭了,这里面就涉及到了是否立即关闭了.
      

  19.   

    通过数据库操作类操作数据库,使用
    using (SqlConnection conn=new sqlConnection();)
    {}
    非法关闭可能没执行关闭操作。
      

  20.   

    多谢各位帮忙,先结贴了,问题基本先使用GC.Collect()解决。
    等有时间在好好看看到底什么原因导致Conn.close不起作用吧。