Я делаю что-то не так с точки зрения пула соединений? - PullRequest
3 голосов
/ 02 февраля 2011

У меня есть класс, который использует ADO.NET и LINQ для доступа к паре баз данных на одном сервере.Таблицы в БД не являются обширными, поэтому объекты сущностей довольно легкие.Я написал код так же хорошо, как я, используя опыт и сетевые статьи, конечно.Например ...

http://dotnetperls.com/sqldataadapter http://www.velocityreviews.com/forums/t71781-set-maximum-pool-size-in-web-config.html http://msdn.microsoft.com/en-us/library/ms971481#adonetbest_topic5

Сервер, на котором выполняется мой код, только выполняет мой код и не является тем же сервером, что и база данныххост.Судя по соединениям, идущим к серверу БД с моего сервера приложений .NET (это служба Windows, но я не хочу останавливаться на этом, поскольку сейчас это кажется несущественным), число соединений составляет около 200, но этоконечно должно быть меньше этого;Это должно быть около 10, так как я установил Max Pool Size равным 10 в appSettings.config.

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

Вот мое создание контекста LINQ DB:

private const string ConnectionKey = "SQL2";
protected static string ConnectionString
{
    get
    {
        return _connectionString = (_connectionString == null) ? ConfigurationManager.ConnectionStrings[ConnectionKey].ConnectionString : _connectionString;
    }
}
private static string _connectionString = null;

protected static PricingDBDataContext ContextDB
{
    get
    {
        if (_context == null)
        {
            _context = new PricingDBDataContext(ConnectionString);
        }

        return _context;
    }
}
private static PricingDBDataContext _context = null;

Вот сторона ADO.NET:

protected DataSet GetDataSet(bool isSproc, string cmdStr, params object[] args)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
        {
            cmd.CommandType = isSproc ? CommandType.StoredProcedure : CommandType.Text;
            for (int index = 0; index < args.Length; index += 2)
                cmd.Parameters.AddWithValue(args[index].ToString(), args[index + 1]);
            conn.Open();
            DataSet set = FillSet(cmd);
            conn.Close();
            return set;
        }
    }
}

private DataSet FillSet(SqlCommand cmd)
{
    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
    DataSet set = new DataSet();
    adapter.Fill(set);
    return set;
}

Спасибо,

Мат.

1 Ответ

2 голосов
/ 02 февраля 2011

Как правило, если вы делаете что-то явно с пулом соединений, вы, вероятно, делаете это неправильно. Настройки по умолчанию хорошо послужили мне с первых дней .Net

Вот некоторые вещи, которые следует иметь в виду:

  • ADO будет пул соединений, которые имеют точно такую ​​же строку соединения
  • Большинство объектов ado.net реализуют IDisposable и должны быть удалены либо явно, либо в блоке using. Сюда входят соединения, команды, наборы данных и устройства чтения данных
  • Контексты данных Linq 2 SQL и EF также реализуют IDisposable и должны быть удалены
...