Запустить и закрыть соединение SQL - в начале и в конце или каждый раз, когда это необходимо? - PullRequest
1 голос
/ 06 апреля 2011

Я делаю веб-приложение на C # с ASP.Net и использую для этого базу данных SQL.В руководствах, которые я видел (о SqlConnection и SqlCommand), они открывают и закрывают соединение SQL каждый раз, когда хотят отправить запрос.Но я не уверен, что это лучший способ справиться с соединением, потому что я также выучил немного PHP, и, насколько я знаю, в PHP вы открываете соединение только один раз, при запуске.Так какой же лучший способ справиться с соединением?

Ответы [ 6 ]

3 голосов
/ 06 апреля 2011

Как правило, у вас должно быть одно соединение и транзакция для длины веб-запроса.

Если у вас два соединения, у вас могут быть противоречивые данные. например в первом запросе вы проверяете баланс банка, а затем закрываете его. Затем вы добавляете 5 долларов к балансу и сохраняете их при следующем подключении. Что, если кто-то еще добавил 5 долларов между двумя соединениями? Это пропало бы.

Самое простое, что нужно сделать, это открыть соединение global.asax BeginRequest и сохранить его в HttpContext. Всякий раз, когда вам нужно соединение, потяните его оттуда. Убедитесь, что вы. Закройте соединение в вашем EndRequest

Кроме того, читайте здесь о пуле соединений: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx Повторное открытие и закрытие соединений не является «дорогим», при условии, что имя пользователя всегда одинаково.

1 голос
/ 06 апреля 2011

Ado.Net уже управляет пулингом соединений, поэтому вам не нужно беспокоиться о повторном использовании соединений.

Вы можете использовать оператор Using для закрытия и удаления соединения:

   DataTable dt = new DataTable();
   using (SqlConnection conn = new SqlConnection("my_connection_string"))
   {
      using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * from Table", conn))
      {
        conn.open();
        adapter.Fill(dt);    
      }
   }
0 голосов
/ 06 апреля 2011

Попробуйте приложение Application Access Block в Enterprise Library , если вы не хотите беспокоиться об открытии и закрытии соединений.

0 голосов
/ 06 апреля 2011

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

В целом:

использование (var ts = new TransactionScope ()) { используя (var connection = new SqlConnection (...)) { используя (var command = new SqlCommand (connection, ...) { ... }

using (var command = new SqlCommand(connection, ...)
{
   ...
}

}

ts.Complete (); } * +1010 *

Конечно, я бы порекомендовал использовать LINQ-to-SQL или EF на этом этапе.

0 голосов
/ 06 апреля 2011

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

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

0 голосов
/ 06 апреля 2011

Обычная практика в .NET - открывать SqlConnection и использовать SqlCommand, а затем избавляться от них обоих.

using(SqlConnection connection = new SqlConnection("myConnectionString"))
{
    using(SqlCommand command = new SqlCommand("dbo.SomeProc"))
    {
        // Execute the command, when the code leaves the using block, each is disposed
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...