Эффективный способ проверки соединения ODBC

Нашим продуктом является процессор транзакций, прослушивающий TCP. Входящим соединениям назначается поток для обработки соединения и соединение с БД для работы.

Вместо дорогостоящего подхода к установке нового соединения с БД для каждого входящего клиентского соединения мы поддерживаем пул соединений с базой данных.

Пул соединений с базой данных легко настраивается: минимальный / максимальный размер, скорость роста и т. Д.

Некоторые сведения:

  • Платформа - Windows 2003/2008 R2
  • БД - SQL Server 2005/2008 R2
  • Метод подключения - ODBC
  • Язык программирования - C ++

Наконец , вопрос:

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

В настоящее время я делаю это, выполняя простой оператор SQL «SELECT 123;», однако я обнаружил, что это оказывает значительное отрицательное влияние на производительность при использовании планов параллельного выполнения.

Вкратце, я делаю следующее:

// ... at some point we decide pool needs another connection...

// Set up database connection
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLAllocHandle(SQL_HANDLE_DBC, env, &conn);
SQLDriverConnect(conn, 0, in_str, in_len, out_str, DIM(out_str), &out_len, SQL_DRIVER_NOPROMPT);

// 'conn' is placed in DB connection pool

// ... some time later a new client connection comes in ...

// Execute simple statement to test if 'conn' is still OK
SQLAllocHandle(SQL_HANDLE_STMT, conn, &stmt);
SQLExecDirect(stmt, (SQLCHAR*)"SELECT 1;", SQL_NTS);

// If 'conn' is OK, give it to incoming connection;
// if not, get another connection from pool

Ура,
Дэйв

9
задан user390935 14 September 2011 в 23:45
поделиться