我正在创建一个asp.net应用程序(我做过的很多)之一 但这是我第一次遇到这个具体问题。
当我第一次在页面上按一个按钮时(因此应用程序已经加载),这非常非常慢。
在我第一次点击按钮后,该页面上的所有其他呼叫都非常快(应该如此)。
我已经打开了sql profiler和charles(http调试器)来查看发生了什么,有趣的部分是:页面本身很慢,执行的查询总共需要+ - 50ms才能执行但是需要18启动对数据库的调用的秒数。
因此.net代码在启动他的sql代码之前需要很长时间。我真的不明白。 我希望有人可以帮助我。
这就是我的应用程序层的完成方式:
主页 - >页面 - > usercontrol(在转发器中) - >按钮。
该按钮只执行一个服务层,该层将访问将开始调用数据库的存储库层。
这是我的日志记录。
这是我的申请结构:
UserService - > UserRepository:RepositoryBase - >数据访问。 代码:
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);
这不是执行它,但只是输入功能。
我很震惊我真的不知道为什么在基类中调用函数需要这么长时间。
我可以添加一些日志记录数据,但它只显示我在这里说的内容。
可能是因为虚拟服务器这是一个属性吗? 因为在非虚拟服务器上测试相同的应用程序根本没有这个问题。
干杯, 微米。
答案 0 :(得分:2)
我在工作中遇到过类似的问题。原因是网站运行的服务器是虚拟服务器。它看起来不像你正在做任何CPU密集型(与我们的应用程序相同),因此不应该有问题。但是,对我们来说,将应用程序放在专用服务器上确实解决了这个问题......
答案 1 :(得分:1)
这里完整地描述了这个答案的问题。 所以我的问题的答案是另一个问题。 谢谢大家!!
https://serverfault.com/questions/174236/iis-7-5-doesnt-cache-3rd-party-dll-on-recycle
答案 2 :(得分:0)
也许在回发时你正在加载一些未在初始GET上加载的控件而且该控件尚未编译,因此编译控件需要很长时间(即网站的文件夹所在的位置)
或许您正在回发到另一个页面?
你能描述你在回发中究竟做了什么吗?
答案 3 :(得分:0)
我猜测CLR会在首次启动时加载(并可能编译)DLL和源代码,添加到启动用于连接数据库的套接字。
您可能希望在启动时初始化数据库连接,以预热CLR以避免这种情况。
另外我建议有点http://msdn.microsoft.com/en-us/library/ff647787.aspx,但你可能想读一读。
答案 4 :(得分:0)
实现一个Page_Init函数,并从那里检查你的时间到LoginLinkButton_Click - 你会把问题分解到你的页面内部或你的webservers管道 - 如果它需要永远到达Page_Init然后web服务器正在做一些奇怪的事情(重建) dll?),如果它从page_init永远需要,那么你就会遇到问题