这段代码在 python 中,但基本上它正在使用OCI
,所以应该可以用任何其他语言重现:
import cx_Oracle as db
dsn = '(DESCRIPTION =(CONNECT_TIMEOUT=3)(RETRY_COUNT=1)(TRANSPORT_CONNECT_TIMEOUT=3)(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = SOME_HOST)(PORT = 1531)))(CONNECT_DATA =(SERVICE_NAME = SOME_NAME)))'
connect_string = "LOGIN/PASSWORD@%s" % dsn
conn = db.connect(connect_string)
conn.ping() # WILL HANG FOREVER!!!
如果SOME_HOST
是down,这将永远挂起!
它与OCIPing
- 如果我替换:
ping()
和:
cursor = conn.cursor()
cursor.execute('SELECT 1 FROM DUAL') # HANG FOREVER AS WELL
这也会挂起。
我正在使用SQL*Plus: Release 11.2.0.3.0 Production on Wed Nov 6 12:17:09 2013。
我尝试将此代码包装在线程中并等待与杀死线程相同的时间,但这不起作用。这段代码自己创建了一个线程,python 不可能杀死它。你对如何恢复有任何想法吗?