12

データベースにアクセスする必要がある 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 で行うことと似ています。

ありがとう

4

4 に答える 4

16

クエリについては、タイマーと conn.cancel() 呼び出しを調べることができます。

それらの行の何か:

t = threading.Timer(timeout,conn.cancel)
t.start()
cursor = conn.cursor()
cursor.execute(query)
res =  cursor.fetchall()
t.cancel()
于 2010-06-04T17:54:41.323 に答える
4

Linux では、/etc/oracle/sqlnet.ora を参照してください。

sqlnet.outbound_connect_timeout= value

オプションもあります:

tcp.connect_timeout と sqlnet.expire_time、頑張ってください!

于 2012-09-27T05:40:30.883 に答える
0

OracleでPROFILEを設定して、特定の数のlogical_reads_per_callおよび/またはcpu_per_callの後にクエリを終了することを検討できます。

于 2010-03-03T23:02:40.720 に答える
-3

システムアラームによるタイムアウト

オペレーティング システムのタイムアウトを使用してこれを行う方法を次に示します。これは一般的であり、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!!
于 2010-03-11T10:38:24.470 に答える