Какова наилучшая практика в ASP.NET для повторного использования подключения к базе данных для миграции MS Access на SQL-сервер?

Как лучше всего открывать и повторно использовать подключение к базе данных в веб-службе ASP.NET (C# 4.0), которая имеет около 5 веб-методов, использующих одну и ту же базу данных? В идеале ответ будет одинаковым для MS Access и SQL-сервера.

  1. Глобальная частная переменная:

    а. Преимущество: простота обслуживания при смене поставщиков баз данных.

    б. Недостаток: нельзя использовать предложение «using», и соединение может оставаться открытым слишком долго — сколько примерно времени соединение будет оставаться открытым?

  2. Передайте соединение с БД в качестве параметра метода:

    а. Преимущество: можно закрыть соединение, когда оно не требуется, используя пункт «using».

    б. Недостаток: раздражает поддерживать и передавать параметр везде

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

    а. Вопрос. Является ли это самым медленным, потому что вам приходится повторно открывать одно и то же соединение несколько раз? ИЛИ из-за скрытого пула соединений это не медленнее? Таким образом, это, вероятно, будет лучшей практикой…?

    б. Вопрос: относится ли пул соединений только к серверу SQL, поэтому он не будет работать для MS Access?

Сначала я думал об использовании глобальной частной переменной (OleDbConnection), так как я довольно часто использую подключение к основной базе данных в веб-методах и методах поддержки, и в ближайшем будущем я буду переходить с MS Access на SQL-сервер и буду легко внести изменения.

Но после прочтения некоторых статей, таких как Получение соединения SQL наиболее эффективно при использовании ASP.NET и веб-служб

кажется, что я могу просто создать новое соединение по запросу в любом месте с помощью пункта «using» и не пострадать от снижения производительности?


person user610064    schedule 10.10.2012    source источник


Ответы (2)


ASP.Net объединяет подключения к базе данных, поэтому вам, как правило, не приходится беспокоиться об этих низкоуровневых деталях. Взгляните на Совет 3 этой статьи MSDN.

person indra    schedule 10.10.2012

Лучшей практикой является вообще не использовать объекты Connection повторно.

public void GetEmployees() As List<Employee> {
    var employees = new List<Employee>();
    using (var connection = new SqlConnection(Configuration.ConnectionString)) {
        using (var command = connection.CreateCommand()) {
            command.CommandText = "SELECT * FROM dbo.Employee";
            connection.Open();
            using (var reader = command.ExecuteReader()) {
                while (reader.Read()) {
                    employees.Add(Employee.CreateRecordFromOpenReader(reader));
                }
            }
        }
    }

    return employees;
}

Затем, если вам нужны транзакции из того, что использует это, настройте DTC и сделайте это.

using (var scope = new TransactionScope()) {
    var employees = GetEmployees();
    employees.Map((e) => e.Status = Status.Active);
    scope.Complete();
}
person Rob    schedule 10.10.2012