oracle 在Python中设置数据库连接超时

ecr0jaav  于 2023-04-29  发布在  Oracle
关注(0)|答案(5)|浏览(404)

我正在创建一个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类似。语句的setQueryTimeout(intseconds)方法在Java中执行。
谢谢

ilmyapht

ilmyapht1#

对于查询,可以查看timer和conn。cancel()调用。
在那些线上的东西:

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

vsdwdz232#

在Linux中,请参阅/etc/oracle/sqlnet。奥拉,
sqlnet.outbound_connect_timeout= value
也有选项:
tcp.connect_timeout和sqlnet。expire_time,祝你好运!

ni65a41a

ni65a41a3#

您可以在Oracle中设置PROFILE,以便在logical_reads_per_call和/或cpu_per_call达到一定数量后终止查询

km0tfn4u

km0tfn4u4#

Windows 11;sqlnet.ora中的下面一行在连接时给了我上述超时。

tcp.connect_timeout=3

betaru所示

svgewumm

svgewumm5#

系统报警超时

下面介绍如何使用操作系统超时来完成此操作。它是通用的,适用于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!!

相关问题