为什么我的应用程序调用非常慢?

时间:2010-08-23 06:33:24

标签: c# asp.net performance

我正在创建一个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);

这不是执行它,但只是输入功能。

我很震惊我真的不知道为什么在基类中调用函数需要这么长时间。

我可以添加一些日志记录数据,但它只显示我在这里说的内容。

可能是因为虚拟服务器这是一个属性吗? 因为在非虚拟服务器上测试相同的应用程序根本没有这个问题。

干杯, 微米。

5 个答案:

答案 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函数,并从那里检查你的时间到LoginLinkBut​​ton_Click - 你会把问题分解到你的页面内部或你的webservers管道 - 如果它需要永远到达Page_Init然后web服务器正在做一些奇怪的事情(重建) dll?),如果它从page_init永远需要,那么你就会遇到问题