2012-10-18 8 views
7

używam pyodbc na Linuksie z FreeTDS do łączenia się z SQL Server 2005. Zauważyłem, że argument limit czasu na moje połączenie nie jest honorowane przez moich zapytaniami.pyodbc.connect Timeout argumentem jest ignorowany dla połączeń z serwerem SQL

Po uruchomieniu poniższej części spodziewałbym się błędów limitu czasu po obu wywołaniach cursor.execute.

import pyodbc 
import time 

connString = 'SERVER=dbserver;PORT=1433;DATABASE=db;UID=dbuser;PWD=dbpwd;' + \ 
    'DRIVER=FreeTDS' 
cnxn = pyodbc.connect(connString , timeout=3) 

cursor = cnxn.cursor() 

t1 = time.time() 
cursor.execute("SELECT MAX(Qty) FROM big_table WHERE ID<10000005") 
print cursor.fetchone() 
t2 = time.time() 
print t2-t1 

cursor.execute("WAITFOR DELAY '00:00:30'") 
print 'OK' 

Zamiast uzyskać ten wynik. Wskazuje, że pierwsze zapytanie db trwa ponad 7,5 sekundy, a drugie wywołanie trwa 30 sekund bez przekroczenia limitu czasu.

(808432.0,) 
7.56196093559 
OK 

Czy istnieje lepszy sposób na wymuszenie limitu czasu zapytania przy użyciu pyodbc i SQL Server?

Odpowiedz

6

Patrz pyodbc connection, istnieją dwa oddzielne limity czasu, zmienna od klasy Connection (ta ustawia timeout dla zapytań) oraz param kluczowe aby pyodbc.connect (i to po jednym dla rzeczywistego procesu połączenia). Na tej podstawie ustawiasz limit czasu dla procesu połączenia w kodzie, a nie na zapytania.

10

Dodaj Connection.timeout przypisanie zmiennych do kodu. Domyślnie 0 (limit czasu wyłączony), oczekiwany w sekundach.

import pyodbc 
import time 

connString = 'SERVER=dbserver;PORT=1433;DATABASE=db;UID=dbuser;PWD=dbpwd;' + \ 
      'DRIVER=FreeTDS' 
cnxn = pyodbc.connect(connString) 
cnxn.timeout = 3 
cursor = cnxn.cursor() 

t1 = time.time() 
cursor.execute("SELECT MAX(Qty) FROM big_table WHERE ID<10000005") 
print cursor.fetchone() 
t2 = time.time() 
print t2-t1 

cursor.execute("WAITFOR DELAY '00:00:30'") 
print 'OK' 
+1

Chociaż ja zaakceptowane odpowiedź cravori poprzez precendence, dajesz ten sam roztwór o bardziej szczegółowe wyjaśnienia. Dziękuję za to. – ChrisGuest

+0

@ChrisGuest Understood. Zmienna "timeout" jest dla mnie również nową informacją i nie od razu było dla mnie jasne, co należy zrobić, aby z niej skorzystać. Mam nadzieję, że to pomoże tym, którzy przez niego biegną i są gęste jak ja :-) – Bryan