2012-10-18 27 views
7

Tôi đang sử dụng pyodbc trên Linux với FreeTDS để kết nối với SQL Server 2005. Tôi đã nhận thấy rằng đối số hết thời gian cho kết nối của tôi không được đáp ứng bởi các truy vấn của tôi.đối số timeout pyodbc.connect bị bỏ qua cho các cuộc gọi đến SQL Server

Khi tôi chạy như sau, tôi mong đợi sẽ thấy các lỗi hết thời gian chờ sau cả hai cuộc gọi.

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' 

Thay vào đó, tôi nhận được kết quả này. Chỉ ra rằng truy vấn db đầu tiên mất hơn 7,5 giây và cuộc gọi thứ hai mất 30 giây mà không cần phải hết thời gian chờ.

(808432.0,) 
7.56196093559 
OK 

Có cách nào tốt hơn để buộc thời gian chờ truy vấn bằng pyodbc và SQL Server không?

Trả lời

6

Tham khảo pyodbc connection, có hai tham số thời gian chờ riêng biệt, một biến trên lớp Kết nối (điều này đặt thời gian chờ truy vấn) và tham số từ khóa thành pyodbc.connect (và điều này cho quá trình kết nối thực). Dựa trên điều này bạn đang thiết lập thời gian chờ cho quá trình kết nối trong mã của bạn và không cho các truy vấn.

10

Thêm Connection.timeout gán phân bổ cho mã của bạn. Mặc định là 0 (hết thời gian chờ), dự kiến ​​tính bằng giây.

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

Trong khi tôi chấp nhận câu trả lời của cravori theo quyền ưu tiên, bạn đưa ra giải pháp tương tự với giải thích chi tiết hơn. Cảm ơn vì điều đó. – ChrisGuest

+0

@ChrisGuest Đã hiểu. Biến 'timeout' là thông tin mới của tôi, và nó không rõ ràng với tôi về những gì cần phải làm để tận dụng nó. Hy vọng rằng điều này sẽ giúp những người chạy qua nó và dày đặc như tôi :-) – Bryan

Các vấn đề liên quan