在一台Web应用服务器上(Windows Server 2008 + IIS7.0),布署的OA办公应用系统,在使用一段时间后(大概20-30分钟左右),系统所有页面打开都出现空白页面,无法正常访问所有的Web页面。
先手动停止IIS应用程序池 然后再启动IIS应用程序池 ,在此过程中应用程序池 出现“执行此操作时出错,服务无法在此时接受控制信息"。
请问如何设置,IIS7应用程序池能够支持某一段时间的高并发请求?谢谢!
可以修改应用程序池的定时回收设置
在IIS 中已经将 回收 中"固定时间间隔(分钟)"改成60
还是解决不了问题。请问具体如何设置下,谢谢!
@lwr: 根本问题是OA系统的问题,设置回收时间是临时解决方法——“大概20-30分钟左右”,回收时间要小于这个时间
@dudu: 好像是的,我将WEB地址访问改到本地自己的开发环境下,发现这个OA系统使用一段时间后,报"未将对象引用设置到对象的实例",而且好像是数据库连接这块。好像没有及时关闭释放数据库连接对象导致的(其实OA系统中已经写好了释放数据库连接这块的代码)。请问,有没有解决方法。
@lwr: 建议仔细检查代码,SqlConnection 与 SqlDataReader 都放到 using 语句块中
using (var conn = new SqlConnection(GlobalSettings.ConnectionString))
{
using (var command = conn.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "...";
command.Parameters.AddWithValue("...", value);
await conn.OpenAsync();
using (IDataReader reader = await command.ExecuteReaderAsync())
{
//...
}
}
}
@dudu:
我在代码中已经释放关闭连接对象了,我没有用using,应该问题也不大吧。
帮忙看看哪里不对。谢谢!
读取数据库的代码大致如下,
public PageBean Select<T>(string sql, IDictionary param) where T : new()
{
PageBean pageBean = new PageBean();
SqlHelper sqlHelper = CreateSqlHelper(sql);
sqlHelper.ParamList = param;
Type entityType = null;
// 若T==BaseInfo,则根据SQL语句,动态构建实体对象(即:无对应的Model类文件)
if (typeof(T) != typeof(BaseInfo))
entityType = CreateObject(sqlHelper.DataReader).GetType();
//记取记录列表到实体列表
while (sqlHelper.DataReader.Read())
{
object obj = entityType != null ? new T() : CreateObject(sqlHelper.DataReader);// System.Activator.CreateInstance(entityType);
Populate(sqlHelper.DataReader, obj);
pageBean.Rows.Add(obj);
}
//读取分页参数
if (sqlHelper.DataReader.NextResult())
{
sqlHelper.DataReader.Read();
pageBean.RecordCount = sqlHelper.DataReader[0] is DBNull ? 0 : Convert.ToInt32(sqlHelper.DataReader[0]);
}
else
{
pageBean.RecordCount = pageBean.Count;
}
sqlHelper.Close();
pageBean.CreateDate = DateTime.Now;
pageBean.PageSize = pageBean.RecordCount;
pageBean.PageIndex = 1;
return pageBean;
}
public IDbConnection _connection = null;
protected IDataReader _dataReader = null;
public bool Close()
{
try
{
if (this._dataReader != null)
{
this._dataReader.Close();
this._dataReader.Dispose();
this._dataReader = null;
}
if (_connection != null && _connection.State != System.Data.ConnectionState.Closed)
{
_connection.Close();
_connection.Dispose();
}
_connection = null;
return true;
}
catch
{
return false;
}
}