本人用ASP.NET2.0写了个应用程序,同时有20左右用户访问。当人多时总是出现打不开网的情况。只得重启服务器,但过不了多久就又不行了。程序方面用Session的传值只是传不长的字符串,数据库处理方面用户DATATABLE存储数据,即用即开即关,DATATABLE都是在方法里定义没有定义成员变量。服务器方面:操作平台用的是WIN2003,数据库为MSSQL2000,最大表的数据量在20万左右。在不掉网时速度没有问题。有这方面经验的朋友请指点一下。

解决方案 »

  1.   

    iis里的网站"性能"设置访问人数限制了吗?虚拟主机的话可能被提供商限制了人数.单独服务器的话20个同时在线根本不是问题啊
      

  2.   

    监视一下,数据库和Web程序,看看问题在哪里。
      

  3.   

    数据有没有分页?20w的数据同时拿出来放在内存。每个IP请求都会执行同一操作。而这块内存又要等到.net的垃圾回收器来回收。页面打不开的时候有没有看过服务器的内存使用状况。
      

  4.   

    可能还有一种情况,就是如果网站是发布过的,则需要将 web.config 中 <compilation debug="true"> 改为
    <compilation debug="false">,因为默认是 <compilation debug="true"> 是调试模式
      

  5.   

    优化。
    见:http://blog.csdn.net/zhoufoxcn/archive/2006/10/09/1327266.aspx
    优化主要是:代码优化,SQL语句优化,数据库结构优化。
      

  6.   

    程序中有调用过一些非托管代码么?调用的其他组件都及时释放空间了么? SQL语句是否最优? IIS的配置是否有问题?
      

  7.   


    首先谢谢你的指点。我用的是独立服务器。如何进行IIS的性能设置?我只会写程序不太会架WEB服务器。
      

  8.   


    我的程序都写在类里,在页面上没代码。
    数据结构比较简单,sql语句都写在存储过程里了。
      

  9.   


    不会是用的GridView自带的分页功能吧......
      

  10.   

    很简单的测试一下:
    把你们的软件卸掉,先放一个简单的aspx页面进行压力测试,看看是否还是20人掉线。
    确定不掉线,那么iis没有问题;改程序吧!!
      

  11.   

    希望会架WEB服务器的朋友多指点一下。把你们架服务器的过程写一下,看看是不是我什么方面没有设置好。
      

  12.   


    登陆页没什么问题,是不是说IIS就没有问题了?我说一下我的程序:数据库连接写成静态属性,对数据库操作(执行SQL语句或存储过程)写成静态方法,返回值为DataTable或Void。这些作为一个类。
    对于数据处理放在一个类里,页面需要的数据通过这个类里的方法得到。是不是这样的写法有问题?
      

  13.   


    在Web.Config里面设置(连接字符串后面写),设置最大数据库连接池为200
      

  14.   

    我的数据库连接是写在类里的,没写在Web.config里。
    是不是这么写?
    "database=pubs;uid=sa;psw=;timeout=0;max pool siz=200"
      

  15.   

    public class class1
        {
            private static SqlConnection Conn = new SqlConnection    ("database=pubs;uid=sa;timeout=0");
            /// <summary>
            /// 获取数据库连接
            /// </summary>
            public static SqlConnection DBConn
            {
                get
                {
                    return Conn;
                }
            }        /// <summary>
            /// 执行存储过程
            /// </summary>
            /// <param name="storeprocedure">存储过程名</param>
            /// <param name="pars">存储过程参数集</param>
            /// <returns>返回执行结果</returns>
            public static int ExecStoreProcedure(string storeprocedure, SqlParameter[] pars)
            {
                int result;            SqlCommand cmd = new SqlCommand();
                cmd.Connection = Conn;
                            if (pars != null)
                {
                    cmd.Parameters.AddRange(pars);
                }
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = storeprocedure;            try
                {
                    cmd.Connection.Open();
                    result = cmd.ExecuteNonQuery();
                }
                catch
                {
                    result = -100;
                }
                finally
                {
                    cmd.Connection.Close();
                }            return result;
            }        /// <summary>
            /// 执行存储过程
            /// </summary>
            /// <param name="dataTable">数据集名称</param>
            /// <param name="storeprocedure">存储过程名</param>
            /// <param name="pars">存储过程参数集</param>
            public static void ExecStoreProcedure(DataTable dataTable, string storeprocedure, SqlParameter[] pars)
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = Conn;
                cmd.CommandType = CommandType.StoredProcedure;
                if (pars != null)
                {
                    cmd.Parameters.AddRange(pars);
                }
                cmd.CommandText = storeprocedure;
                SqlDataAdapter da = new SqlDataAdapter(cmd);            try
                {
                    da.Fill(dataTable);
                }
                catch
                {
                    dataTable = null;
                }
            }        /// <summary>
            /// 执行SQL语句
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <returns>返回执行数据集</returns>
            public static DataTable ExecSql(string sql)
            {
                DataTable dt = new DataTable();
                SqlCommand cmd = new SqlCommand(sql, Conn);
                cmd.CommandType = CommandType.Text;
                SqlDataAdapter da = new SqlDataAdapter(cmd);            try
                {
                    da.Fill(dt);
                }
                catch
                {
                    dt = null;
                }            return dt;
            }
        }在处理数据时,我只在方法里调用这些方法,取得返回值或执行语句。
      

  16.   

    ///  <summary> 
            /// 执行存储过程 
            ///  </summary> 
            ///  <param name="dataTable">数据集名称 </param> 
            ///  <param name="storeprocedure">存储过程名 </param> 
            ///  <param name="pars">存储过程参数集 </param> 
            public static void ExecStoreProcedure(DataTable dataTable, string storeprocedure, SqlParameter[] pars) 
            { 
                SqlCommand cmd = new SqlCommand(); 
                cmd.Connection = Conn; 
                cmd.CommandType = CommandType.StoredProcedure; 
                if (pars != null) 
                { 
                    cmd.Parameters.AddRange(pars); 
                } 
                cmd.CommandText = storeprocedure; 
                SqlDataAdapter da = new SqlDataAdapter(cmd);             try 
                { 
                    da.Fill(dataTable); 
                } 
                catch 
                { 
                    dataTable = null; 
                } 
            }         ///  <summary> 
            /// 执行SQL语句 
            ///  </summary> 
            ///  <param name="sql">SQL语句 </param> 
            ///  <returns>返回执行数据集 </returns> 
            public static DataTable ExecSql(string sql) 
            { 
                DataTable dt = new DataTable(); 
                SqlCommand cmd = new SqlCommand(sql, Conn); 
                cmd.CommandType = CommandType.Text; 
                SqlDataAdapter da = new SqlDataAdapter(cmd);             try 
                { 
                    da.Fill(dt); 
                } 
                catch 
                { 
                    dt = null; 
                }             return dt; 
            } 
        } 这两个方法没有“及时”的释放数据库连接对象。
    MS宣传说返回DataSet的方法可以不写dispose代码,但实际上是不行的。具体你看一下GC的处理机制。
      

  17.   

    自带的分页,效率和不分一样,这个是不对的,分页最好用分页的存储过程和分页控件来作另外,看看connection每次用完关了没有
      

  18.   

    GC的处理机制你google下,一搜一把。
    简单说,就是执行完的代码的对象的资源释放如果直接交给GC的话,是不会被立即释放的,而是会等到资源紧张的时候才会释放空闲的资源。所以,你的那两个方法需要通过代码的方式来关闭连接释放资源。
    你也可以通过执行代码,同时观察数据库的连接数的变化来进行测试。