Commish13 Ответов: 2

Откройте базу данных один раз для нескольких методов


Я не хочу открывать и закрывать соединение с базой данных несколько раз на своей странице. Я делаю несколько звонков в базу данных и запускаю несколько хранимых процедур, и это замедляет время загрузки моей страницы.

Как вы можете видеть, я показываю не все методы. Должен же быть более эффективный способ сделать это?

Что я уже пробовал:

protected void Page_Load(object sender, EventArgs e)
    {    
        if (!this.IsPostBack)
        {
            this.Method_1();
        }
    }
    private void Method_1()
    {
        string connString = ConfigurationManager.ConnectionStrings["***"].ConnectionString;
        using (conn = new SqlConnection(connString))
        {
            conn.Open();
            using (SqlCommand comm = new SqlCommand("GetStoredProc_1", conn))
            {
                using (SqlDataReader reader = comm.ExecuteReader())
                {
                    if (reader.Read())
                    {
                       Something here is true



                        if(Something here is true) 
                        {                      
                            reader.Close();
                            LoadSchedule();
                            LoadTeamRecord();
                        }
                        else
                        {
                            Response.Redirect("Some Page.aspx");
                        }
                    }
                }
            }
        }
    }
    private void LoadSchedule()
    {          
        string connString = ConfigurationManager.ConnectionStrings["***"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            using (SqlCommand comm = new SqlCommand("GetStoredProc_2", conn))
            {
                using (SqlDataReader reader = comm.ExecuteReader())
                {
                    myRepeater.DataSource = reader;
                    myRepeater.DataBind();

......

F-ES Sitecore

Если ваш код медленный, то это ваши sql-команды\sps, которые медленны, а не открытие нескольких соединений. Как уже упоминалось в решениях, ADO реализует пул соединений, поэтому вы на самом деле ничего не открываете и не закрываете, а просто получаете существующие соединения из пула и возвращаете их обратно.

2 Ответов

Рейтинг:
2

OriginalGriff

Стоимость подключения должна быть довольно короткой, и это хорошая практика, чтобы удерживать соединение в течение как можно более короткого времени.

Но... если вы уверены, что именно это влияет на время загрузки, то создайте глобальный объект SqlConnection и откройте его в обработчике событий загрузки Page_), а затем повторно используйте его в других методах, не забывая закрыть и удалить соединение в конце обработчика.

Но абсолютно убедитесь, что вы закрываете и удаляете все DataReaders, когда закончите с ними: вы не можете делать ничего другого с подключением, пока у вас есть и открыт Reader.

Однако я не думаю, что это значительно улучшит время вашей загрузки. Вместо этого я бы внимательно посмотрел на ваши хранимые процедуры.


Maciej Los

Согласитесь!

Commish13

Спасибо за ваши ответы. Есть ли способ узнать, что замедляет мое время загрузки?

OriginalGriff

Зависит от того, какая версия VS у вас есть, но начните с поиска в Google "профилирования VS" - он может дать вам массу информации, если вы используете его правильно (Google также объяснит, как это сделать).
Если у вас нет встроенного профилирования, то вам нужно начать собирать информацию. Используйте класс Stopwatch и регистрируйте, сколько времени занимает каждая часть вашего кода. Когда вы определили широкую область, вы можете начать добавлять больше журналов, чтобы сузить область, на которой вам нужно сосредоточиться.

Мы не можем сделать ничего из этого для вас: ему нужен ваш код, работающий вместе с вашими данными - и у нас нет доступа ни к одному из них!

Commish13

Спасибо. Я начну изучать свои хранимые процедуры и узнаю, что происходит

Richard Deeming

"... создайте глобальный объект SqlConnection ..."

NB: Это не сработает внутри ASP.NET - тот самый SqlConnection класс не является потокобезопасным, и наличие нескольких запросов, пытающихся использовать одно и то же глобальное соединение, приведет к серьезным проблемам.

Поверьте мне - унаследовав сайт, который сделал именно это несколько лет назад, я знаю, как плохо это может быть! :)

OriginalGriff

Хороший момент - я имел в виду глобальный, как в глобальном экземпляре класса страницы, а не "глобальный" в значении "статический единственный экземпляр". Мне следовало быть более точным.

SqlConnection может обрабатывать только один SqlReader за раз, вы немедленно получите ошибку, если попытаетесь выдать другую SqlCommand на том же соединении, так что действительно глобальное SqlConnection, вероятно, сразу же потерпит неудачу на веб-сайте.

Спасибо - я постараюсь запомнить, чтобы быть более точным в будущем ...

Рейтинг:
2

RickZeeland

Поскольку SQL Server использует метод оптимизации, называемый пул соединений, стоимость повторного подключения обычно не должна вызывать беспокойства.
Видеть: Подключение к SQL-сервер пула (ADO.NET) | Майкрософт документы[^]