Ошибка TinyTds: Превышено время ожидания подключения адаптивного сервера
Мы запускаем приложение ruby on rails на рельсах 3.2.12 (ruby 1.9.3) с текущим камнем tinyTDS 0.6.2.
Мы используем MS SQL 2012 или 2014 и, как правило, сталкиваемся со следующим сообщением об ошибке:
TinyTds::Error: Adaptive Server connection timed out: EXEC sp_executesql [...]
База данных AUTOCLOSE выключена. Таймауты сокетов TCP являются системой Windows по умолчанию.
Сервер приложений находится на компьютере № 1 (сервер Windows), сервер SQL находится на компьютере № 2 (сервер Windows).
Когда я проверяю соединения (netstat), у меня примерно 250 соединений, открытых примерно для 20-30 пользователей. Я запускаю execute.exe, чтобы увидеть время простоя на сервере SQL для дисков с данными и журналами.
У database.yml есть связь pool:32
а также reconnect:true
,
Мне кажется, что tinyTDS потерял соединение, и любое исключение не позволяет восстановить соединение.
Вопрос в том, как я могу отладить проблему, чтобы выяснить, в чем проблема?
ОБНОВИТЬ
Моя ошибка, оригинальное сообщение об ошибке принадлежит tinytDS 0.5.x. Поскольку я обновился до последней версии, я получаю следующую ошибку в дополнение или вместо этого:
ActiveRecord::LostConnection (TinyTds::Error: DBPROCESS is dead or not enabled: BEGIN TRANSACTION):
1 ответ
Во-первых, этот размер пула кажется чрезмерным. Вы используете тонну нитей? Если нет, то для каждого запроса / ответа приложения будет использоваться только одно соединение. Просто кажется, что это значение слишком высоко.
Во-вторых, какой тайм-аут SQL истек? Вы обнаружили, что некоторые SQL медленнее других? Если так, то у вас есть два варианта. Первым было бы настроить БД с использованием стандартных методов, таких как индексы и т. Д. Вторым было бы увеличить параметр "timeout" в вашем database.yml. Время ожидания по умолчанию составляет 5000, что составляет 5 секунд. Вы пытались установить его на 10000? Я предполагаю, что я спрашиваю, как вы уверены, что это тайм-аут "соединения" против таймаута "ожидания"?