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