2013-09-12 4 views
3

Мне не удалось найти документально установленный способ установить тайм-аут для начального соединения, которое действительно работает. Я не спрашиваю о «тайм-ауте запроса», а скорее о тайм-ауте при попытке первоначального подключения в случае, когда сервер БД полностью недоступен или недоступен, и ответа вообще нет. По умолчанию такие соединения кажутся таймаутом через 255 секунд - есть ли способ установить более короткий тайм-аут?Как установить тайм-аут подключения к базе данных для драйвера python/pyodbc/unixODBC/MS ODBC 11 для стека SQL Server/Linux?

Edit: для ясности, я должен повторить стек здесь:

  • питона
  • pyodbc
  • UnixODBC (не iODBC)
  • MS ODBC Driver 11 для SQL Server (не FreeTDS)
  • Linux
+0

Согласно [этой странице] (http://msdn.microsoft.com/en-us/library/ms130822.aspx) нет, нет способа указать время ожидания соединения в ODBC. Вы можете попробовать поставить 'connect timeout = X' в свой файл' odbc.ini' - он не должен работать, но это может быть недокументированное обходное решение. Если это так, я бы не стал доверять этому в производственной среде. –

+0

Вы можете попробовать выполнить свой собственный тайм-аут для функции подключения, используя [ответ] (http://stackoverflow.com/questions/11901328/how-to-timeout-function-in-python-timeout-less-than-a- второй) здесь. – Bryan

+0

Увы, этот декодер тайм-аута или аналогичный не будет работать, потому что соединение открывается в двоичном MS ODBC-драйвере, вне контроля интерпретатора Python. – CryingCyclops

ответ

1

https://stackoverflow.com/a/12946908/1552953

Этот ответ относится к возможности установить тайм-аут на связи:

Тайм-аут

Дополнительный тайм-аут число запросов, в секундах. Используйте ноль, по умолчанию, чтобы отключить.

Таймаут применяется ко всем курсорам, созданным соединением, поэтому не может быть изменен для данного соединения.

Если возникает тайм-аут запроса, база данных должна поднять 0 OperationalError с помощью SQLSTATE HYT00 или HYT01.

Примечание: Этот атрибут влияет только на запросы. Чтобы установить таймаут для фактического процесса подключения , используйте ключевое слово timeout для функции pyodbc.connect .

result = None 
with pyodbc.connect('DRIVER={SQL Server};SERVER=mydb;DATABASE=solarwinds;Trusted_Connection=True', timeout=1) as cnxn: 
    cursor = cnxn.cursor() 
    result = cursor.execute(query).fetchall() 

Таким образом, используя код выше он не таймаут в течение 1 секунды, или, по крайней мере, он не возвращает результат в течение 1 секунды. Но он действительно возвращал результат намного быстрее, чем без тайм-аута.

+0

Я больше не использую среду для проверки этого, и, несмотря на упоминание в этой заметке, эта функция недокументирована в разделе о функции pyodbc.connect; но, глядя на код, похоже, по крайней мере, была предпринята попытка почтить это ключевое слово. Я принимаю этот ответ, поскольку кажется, что это должен быть предписанный способ сделать это, но справедливое предупреждение для всех: YMMV, поскольку доступные базовые двоичные драйверы просто никогда не были хорошо себя вести. – CryingCyclops