簡體   English   中英

在Python中設置數據庫連接超時

[英]Set database connection timeout in Python

我正在創建一個需要訪問數據庫的RESTful API。 我正在使用Restish,Oracle和SQLAlchemy。 但是,我會嘗試盡可能一致地構建我的問題,而不考慮Restish或其他Web API。

我希望能夠為執行查詢的連接設置超時。 這是為了確保放棄長時間運行的查詢,並丟棄(或回收)連接。 此查詢超時可以是全局值,這意味着,我不需要根據查詢或連接創建更改它。

給出以下代碼:

import cx_Oracle
import sqlalchemy.pool as pool

conn_pool = pool.manage(cx_Oracle)
conn = conn_pool.connect("username/p4ss@dbname")
conn.ping()

try:
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM really_slow_query")
    print cursor.fetchone()
finally:
    cursor.close()

如何修改上面的代碼來設置查詢超時? 此超時是否也適用於連接創建?

這類似於java.sql.Statement的setQueryTimeout(int seconds)方法在Java中的作用。

謝謝

對於查詢,您可以查看計時器和conn.cancel()調用。

這些方面的東西:

t = threading.Timer(timeout,conn.cancel)
t.start()
cursor = conn.cursor()
cursor.execute(query)
res =  cursor.fetchall()
t.cancel()

在linux中看到/etc/oracle/sqlnet.ora,

sqlnet.outbound_connect_timeout= value

也有選擇:

tcp.connect_timeout和sqlnet.expire_time,祝你好運!

您可以查看在Oracle中設置PROFILE以在一定數量的logical_reads_per_call和/或cpu_per_call之后終止查詢

使用系統警報進行定時

以下是使用操作系統timout執行此操作的方法。 它是通用的,適用於Oracle之外的其他東西。

import signal
class TimeoutExc(Exception):
    """this exception is raised when there's a timeout"""
    def __init__(self): Exception.__init__(self)
def alarmhandler(signame,frame):
    "sigalarm handler.  raises a Timeout exception"""
    raise TimeoutExc()

nsecs=5
signal.signal(signal.SIGALRM, alarmhandler)  # set the signal handler function
signal.alarm(nsecs)                          # in 5s, the process receives a SIGALRM
try:
    cx_Oracle.connect(blah blah)             # do your thing, connect, query, etc
    signal.alarm(0)                          # if successful, turn of alarm
except TimeoutExc:
    print "timed out!"                       # timed out!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM