Эффективный способ проверить соединение ODBC - PullRequest
9 голосов
/ 15 сентября 2011

Наш продукт является обработчиком транзакций прослушивания 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

Приветствия
Dave

1 Ответ

9 голосов
/ 15 сентября 2011

Что ж, официальный путь - SQLGetConnectAttr (SQL_ATTR_CONNECTION_DEAD), который проверяет, работало ли соединение при последней попытке.

Или SQLGetConnectAttr (conn, SQL_COPT_SS_CONNECTION_DEAD, ...), который проверяет, работает ли сейчас соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...