Наличие одного SQLConnection на всем веб-сайте asp.net или наличие отдельных соединений для каждого запроса к БД

Хорошо, мой вопрос требует большого опыта в этом деле.

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

Теперь какой из них лучше, почему?

Каковы минусы и плюсы?

Asp.net, веб-сайт .net 4.5, С#

using System;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data;
using System.Collections.Generic;

public static class DbConnection
{
    public static string srConnectionString = "server=localhost;database=my_DB;uid=sa;pwd=my_PW;";

    public static DataSet db_Select_Query(string strQuery)
    {
        DataSet dSet = new DataSet();
        if (strQuery.Length < 5)
            return dSet;
        try
        {
            using (SqlConnection connection = new SqlConnection(srConnectionString))
            {
                connection.Open();
                using (SqlDataAdapter DA = new SqlDataAdapter(strQuery, connection))
                {
                    DA.Fill(dSet);
                }
            }
            return dSet;
        }catch(Exception){}

        return dSet;
    }
}

А здесь одно соединение по всем темам, по всему сайту

using System;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data;
using System.Collections.Generic;

public static class DbConnection
{
    private static string srConnectionString = "server=localhost;database=my_DB;uid=sa;pwd=my_PW;";

    private static SqlConnection connection = new SqlConnection(srConnectionString);

    static DbConnection()
    {
        connection.Open();
    }

    public static DataSet db_Select_Query(string strQuery)
    {
        DataSet dSet = new DataSet();
        if (strQuery.Length < 5)
            return dSet;
        try
        {
            using (SqlDataAdapter DA = new SqlDataAdapter(strQuery, connection))
            {
                DA.Fill(dSet);
            }

            return dSet;
        }
        catch (Exception) { }

        return dSet;
    }
}

person MonsterMMORPG    schedule 17.09.2014    source источник
comment
Определенно не второй, вы получите потоки, пытающиеся использовать одно и то же соединение в одно и то же время, которое может быть или не быть открытым. Вы должны по крайней мере иметь соединение на запрос.   -  person Ben Robinson    schedule 17.09.2014
comment
@BenRobinson ty, так что лучше иметь отдельное соединение для каждого запроса к БД, верно?   -  person MonsterMMORPG    schedule 17.09.2014
comment
Это не обязательно должно быть для каждого запроса, но вы не хотите, чтобы одно статическое соединение использовалось потоками из разных запросов, вы попадете в ужасный беспорядок, оно просто будет постоянно терпеть неудачу, по-видимому, случайным образом.   -  person Ben Robinson    schedule 17.09.2014
comment
Согласен с Беном - второй вариант был бы ужасен. он не является потокобезопасным и не масштабируется под нагрузкой.   -  person Daniel Kelley    schedule 17.09.2014


Ответы (1)


Я думаю, что вам нужно прочитать Пул соединений SQL Server (ADO.NET).

Из двух вариантов, которые вы указали, вариант 1 лучше, поскольку вы удаляете соединение, как только закончите с ним. В сочетании с пулом соединений, который обычно включен в ADO.NET по умолчанию, удаленное соединение фактически не будет закрыто, а будет возвращено в пул, чтобы его можно было снова использовать другим запросом. Поэтому вы обнаружите, что вариант 1 значительно превосходит вариант 2, когда речь идет о большом количестве одновременных запросов.

person Adrian Sanguineti    schedule 18.09.2014