本人用ASP.NET2.0写了个应用程序,同时有20左右用户访问。当人多时总是出现打不开网的情况。只得重启服务器,但过不了多久就又不行了。程序方面用Session的传值只是传不长的字符串,数据库处理方面用户DATATABLE存储数据,即用即开即关,DATATABLE都是在方法里定义没有定义成员变量。服务器方面:操作平台用的是WIN2003,数据库为MSSQL2000,最大表的数据量在20万左右。在不掉网时速度没有问题。有这方面经验的朋友请指点一下。
调试欢乐多
<compilation debug="false">,因为默认是 <compilation debug="true"> 是调试模式
见:http://blog.csdn.net/zhoufoxcn/archive/2006/10/09/1327266.aspx
优化主要是:代码优化,SQL语句优化,数据库结构优化。
首先谢谢你的指点。我用的是独立服务器。如何进行IIS的性能设置?我只会写程序不太会架WEB服务器。
我的程序都写在类里,在页面上没代码。
数据结构比较简单,sql语句都写在存储过程里了。
不会是用的GridView自带的分页功能吧......
把你们的软件卸掉,先放一个简单的aspx页面进行压力测试,看看是否还是20人掉线。
确定不掉线,那么iis没有问题;改程序吧!!
登陆页没什么问题,是不是说IIS就没有问题了?我说一下我的程序:数据库连接写成静态属性,对数据库操作(执行SQL语句或存储过程)写成静态方法,返回值为DataTable或Void。这些作为一个类。
对于数据处理放在一个类里,页面需要的数据通过这个类里的方法得到。是不是这样的写法有问题?
在Web.Config里面设置(连接字符串后面写),设置最大数据库连接池为200
是不是这么写?
"database=pubs;uid=sa;psw=;timeout=0;max pool siz=200"
{
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;
}
}在处理数据时,我只在方法里调用这些方法,取得返回值或执行语句。
/// 执行存储过程
/// </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的处理机制。
简单说,就是执行完的代码的对象的资源释放如果直接交给GC的话,是不会被立即释放的,而是会等到资源紧张的时候才会释放空闲的资源。所以,你的那两个方法需要通过代码的方式来关闭连接释放资源。
你也可以通过执行代码,同时观察数据库的连接数的变化来进行测试。