C # Как «проверить», что новые соединения на самом деле повторно используются из пула соединений - PullRequest
2 голосов
/ 25 января 2012

У меня есть простой код C #, в котором я пытаюсь открывать и закрывать соединения несколько раз. Как я могу убедиться, что мои новые соединения приходят из пула соединений и что они не попадают в базу данных?

using System;
using System.Data;
using System.Data.Odbc;
using System.Collections.Generic;

namespace LBSService
{
    class MyClass    {
        public static OdbcConnection connection = null;       
        public void TestConnection()
        {
            string connectionstring = @"Dsn=my_database.IServer;Host=IServer;
                                        Database=my_database;Uid=informix;
                                        Pwd=Some@123";

            for (int i = 1; i <= 50; i++)
            {
                string StrQuery = "select * from capture_files";
                connection = new OdbcConnection(connectionstring);
                connection.Open();
                connection.Close();
            }
        }
    }
}

У меня есть ограничение на открытие соединения ODBC, поэтому предпочтителен ответ, связанный с ODBC.

Есть ли какой-либо элемент данных в моем объекте 'connection' или что-то такое, где я действительно могу видеть, сколько неиспользуемых соединений есть в пуле и сколько используется моим приложением.

Заранее спасибо ...

Ответы [ 3 ]

3 голосов
/ 25 января 2012

"Как я могу убедиться, что мои новые соединения исходят из пула соединений и что он не попадает в базу данных"

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

Если у вас точно такая же строка соединения (вплоть до регистрадаже), затем вы будете повторно использовать соединение из пула (при условии, что оно включено, что является значением по умолчанию).

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

Пул соединений с SQL Server :

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

На практике большинство приложений используют только одну или несколько разных конфигураций для соединений.Это означает, что во время выполнения приложения многие идентичные соединения будут многократно открываться и закрываться.Чтобы минимизировать стоимость открытия соединений, ADO.NET использует технику оптимизации, которая называется пул соединений.

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

В пул могут быть соединены только соединения с одинаковой конфигурацией.ADO.NET хранит несколько пулов одновременно, по одному для каждой конфигурации.Соединения разделяются на пулы по строке соединения и по идентификатору Windows при использовании встроенной защиты.Соединения также объединяются в зависимости от того, зачислены ли они в транзакцию.

1 голос
/ 25 января 2012

Вы можете взглянуть на ADO.net Performancecounters , чтобы убедиться, что только один раз активно соединение с базой данных

0 голосов
/ 25 января 2012

Вы можете использовать тайминги в своей функции, добавляя и удаляя строку подключения следующим образом:

Pooling=false;

Если время варьируется - тогда без этой строки соединения повторно используются

Вот так:

public long TestConnection(bool usepooling)
{
  string connectionstring = @"Dsn=my_database.IServer;Host=IServer;
                                    Database=my_database;Uid=informix;
                                    Pwd=Some@123;Pooling="+usepooling.ToString;


  Stopwatch sw = new Stopwatch();
  for (int i = 1; i <= 50; i++)
  {
    string StrQuery = "select * from capture_files";
    connection = new OdbcConnection(connectionstring);
    sw.Start();
    connection.Open();
    connection.Close();
    sw.Stop();
  }

  return sw.ElapsedMilliseconds;

}
...