Нашим продуктом является процессор транзакций, прослушивающий TCP. Входящим соединениям назначается поток для обработки соединения и соединение с БД для работы.
Вместо дорогостоящего подхода к установке нового соединения с БД для каждого входящего клиентского соединения мы поддерживаем пул соединений с базой данных.
Пул соединений с базой данных легко настраивается: минимальный / максимальный размер, скорость роста и т. Д.
Некоторые сведения:
Наконец , вопрос:
Поскольку служба может работать в течение нескольких месяцев без перезапуска, существует реальная вероятность того, что некоторые соединения с базой данных в пуле станут недействительными. Я хочу иметь как можно более быстрый способ проверить действительность данного соединения, прежде чем назначать его входящему соединению.
В настоящее время я делаю это, выполняя простой оператор 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
Ура,
Дэйв