Как поддерживать соединение с базой данных в приложении ASP.NET MVC? - PullRequest
7 голосов
/ 21 марта 2012

Я не использую биты LINQ-to-SQL или Entity Framework в веб-приложении и в настоящее время использую что-то вроде этого (это для проекта класса):

using System.Data;
using System.Data.SqlClient;

namespace StackOverflowClone.Models
{
    public class Database
    {
        public static SqlConnection ActiveConnection { get; private set; }

        static Database()
        {
            ActiveConnection = new SqlConnection(
                "Data Source=********.database.windows.net;" +
                "Initial Catalog=EECS341;Uid=*****;Pwd=*******;" + 
                "MultipleActiveResultSets=True;");
            ActiveConnection.Open();
        }
    }
}

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

Предоставляет ли фреймворк встроенный метод обработки этого или я просто должен иметь функцию, которая каждый раз выкашивает соединения с базой данных, новые?

Ответы [ 3 ]

12 голосов
/ 21 марта 2012

или мне просто нужна функция, которая каждый раз выкашивает соединения с базой данных, новые?

Да, сделай это. Пусть ADO.NET пул соединений обработает детали для вас. Ваша цель должна состоять в том, чтобы держать соединение открытым в течение максимально короткого периода времени.

Пул подключений уменьшает количество новых подключений должен быть открыт. Пулер поддерживает право собственности на физическое подключение. Он управляет связями, поддерживая набор активных соединения для каждой данной конфигурации соединения. Всякий раз, когда пользователь звонки открыты по соединению, пулер ищет доступное соединение в бассейне. Если доступно объединенное соединение, оно возвращает его вызывающей стороне вместо открытия нового соединения. Когда приложение вызывает Close на соединение, диспетчер возвращает его объединенный набор активных соединений вместо его закрытия. Однажды соединение возвращается в пул, оно готово для повторного использования на следующий открытый звонок.

Итак, создайте статический метод GetConnection(), который возвращает новое открытое соединение. Используйте это в операторе using, чтобы его можно было закрыть и как можно скорее вернуть в пул соединений.

using(var cn = Database.GetConnection())
{
    //query your data here, Dapper example below
    cn.Execute("update MyTable set MyField = @newValue", new {newValue});
}
4 голосов
/ 21 марта 2012

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

Смотрите мой ответ о using: https://stackoverflow.com/a/9811911/290343

1 голос
/ 22 марта 2012

Предоставляет ли фреймворк встроенный метод обработки этого или я должен просто иметь функцию, которая откашливает соединения с базой данных new'd каждый раз?

И то и другое.

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

Фактические соединения с базой данных объединяются. При удалении объекта соединения фактическое соединение не закрывается, а возвращается в пул. Если вы создадите новый объект подключения с той же строкой подключения, он просто повторно использует подключение из пула.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...