我正在创建一个asp.net应用程序(我已经做过很多次)。
但这是我第一次遇到这个具体的问题。
当我在页面上第一次点击按钮(所以应用程序已经加载)时,这非常慢。
在我点击按钮之后,该页面上的所有其他调用都非常快(应该是这样的)。
我已经打开了sql profiler和charles(http debugger)来查看发生了什么,有趣的是:页面本身很慢,执行的查询总共需要约50毫秒才能执行,但是启动对数据库的调用需要18秒钟。
因此,.net代码在开始执行其sql代码之前需要非常长的时间。我真的不明白。 希望有人可以帮助我。
这是我的应用程序层如何完成的:
Masterpage -> 页面 -> 用户控件(在repeater中)-> 按钮。
按钮只执行一个服务层,该服务层将访问存储库层,该层将开始调用数据库。
以下是我得到的日志记录。
这是我的应用程序结构:
UserService -> UserRepository: RepositoryBase -> dataAccess. 代码:
记录显示,仅输入此函数就需要14秒钟。
当我在页面上第一次点击按钮(所以应用程序已经加载)时,这非常慢。
在我点击按钮之后,该页面上的所有其他调用都非常快(应该是这样的)。
我已经打开了sql profiler和charles(http debugger)来查看发生了什么,有趣的是:页面本身很慢,执行的查询总共需要约50毫秒才能执行,但是启动对数据库的调用需要18秒钟。
因此,.net代码在开始执行其sql代码之前需要非常长的时间。我真的不明白。 希望有人可以帮助我。
这是我的应用程序层如何完成的:
Masterpage -> 页面 -> 用户控件(在repeater中)-> 按钮。
按钮只执行一个服务层,该服务层将访问存储库层,该层将开始调用数据库。
以下是我得到的日志记录。
这是我的应用程序结构:
UserService -> UserRepository: RepositoryBase -> dataAccess. 代码:
public User GetByEmailAndPassword(string email, string password)
{
_log.Info("UserRepository.GetByEmailAndPassword - Start");
this.Test();
User result = null;
List<DbParam> parameters = new List<DbParam>();
parameters.Add(new DbParam("@Email", email, DbType.String));
parameters.Add(new DbParam("@Password", password, DbType.String));
_log.Info("UserRepository.GetByEmailAndPassword - Entering reader");
var reader = ExecuteReader("User_GetByEmailAndPassword", parameters);
if (reader.Read())
{
result = _entityFactory.ConvertToModel(reader);
}
reader.Close();
_log.Info("UserRepository.GetByEmailAndPassword - End");
return result;
}
仓库基础:
public abstract class RepositoryBase<T>
where T : IEntity
{
private static ILog _log = LogManager.GetLogger(typeof(RepositoryBase<T>));
protected IEntityFactory<T> _entityFactory;
protected RepositoryBase()
{
_log.Info("Constructor");
_entityFactory = EntityFactoryBuilder.BuildFactory<T>();
}
protected IDataReader ExecuteReader(string storedProc, List<DbParam> parameters)
{
_log.Info("ExecuteReader - Start");
_log.Info("Open connection");
var db = DatabaseFactory.CreateDatabase();
_log.Info("Open command");
var dbCommand = db.GetStoredProcCommand(storedProc);
foreach (DbParam param in parameters)
{
db.AddInParameter(dbCommand, param.Name, param.Type, param.Value);
}
_log.Info("Execute command");
var reader = db.ExecuteReader(dbCommand);
_log.Info("ExecuteReader - End");
return reader;
}
}
记录显示,仅输入此函数就需要14秒钟。
var reader = ExecuteReader("User_GetByEmailAndPassword", parameters);
这并不是在执行函数,而只是在调用函数。
我很惊讶,我真的不知道为什么调用基类中的函数需要这么长时间。
我可以添加一些日志数据,但它只会显示我在这里所说的内容。
这可能是由于虚拟服务器造成的属性吗?
因为在非虚拟服务器上测试相同的应用程序根本没有这个问题。
谢谢, M.