在Python中设置数据库连接超时
我正在创建一个需要访问数据库的RESTful API。我使用的是Restish、Oracle和SQLAlchemy。不过,我会尽量把我的问题说得简单一些,不考虑Restish或其他网络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中java.sql.Statement的setQueryTimeout(int seconds)方法的功能。
谢谢
5 个回答
0
你可以考虑在Oracle中设置PROFILE,这样可以在查询的逻辑读取次数或每次调用的CPU使用达到一定数量后自动终止这些查询。
5
在Linux系统中,可以查看这个文件:/etc/oracle/sqlnet.ora。
里面有一行代码:sqlnet.outbound_connect_timeout= value
,这个是用来设置连接超时时间的。
此外,还有其他选项可以设置:
tcp.connect_timeout和sqlnet.expire_time。祝你好运!
16
关于这个查询,你可以查看定时器和 conn.cancel() 的调用。
大概是这样的:
t = threading.Timer(timeout,conn.cancel)
t.start()
cursor = conn.cursor()
cursor.execute(query)
res = cursor.fetchall()
t.cancel()