下一代码可以正常使用即时客户端10g,但在使用oracle即时客户端11g时挂断,挂起在pool.release(conN),
import time
print '---------------------------------'
import cx_Oracle
print cx_Oracle.clientversion()
time.sleep(1)
pool = cx_Oracle.SessionPool('login', 'pass', "dbserver:1521/db", 1, 6, 2)
pool.timeout = 60
con11 = pool.acquire()
con12 = pool.acquire()
con13 = pool.acquire()
con14 = pool.acquire()
con15 = pool.acquire()
pool.release(con11)
pool.release(con12)
pool.release(con13)
pool.release(con14)
pool.release(con15)
for i in xrange(100000):
print '-=-' + str(i) + '-=-'
print str(pool.opened) + " " + str(pool.busy)
con1 = pool.acquire()
cursor = con1.cursor()
cursor.execute("SELECT * FROM DUAL")
count = cursor.fetchall()[0][0]
cursor.close()
print str(pool.opened) + " " + str(pool.busy)
con2 = pool.acquire()
cursor = con2.cursor()
cursor.execute("SELECT * FROM DUAL")
count = cursor.fetchall()[0][0]
cursor.close()
print str(pool.opened) + " " + str(pool.busy)
con3 = pool.acquire()
cursor = con3.cursor()
cursor.execute("SELECT * FROM DUAL")
count = cursor.fetchall()[0][0]
cursor.close()
print str(pool.opened) + " " + str(pool.busy)
t1 = time.time()
pool.release(con3)
t2 = time.time()
print t2 - t1
print str(pool.opened) + " " + str(pool.busy)
t1 = time.time()
pool.release(con2)
t2 = time.time()
print t2 - t1
t1 = time.time()
pool.release(con1)
t2 = time.time()
print t2 - t1
print str(pool.opened) + " " + str(pool.busy)
print '---------------------------------'
PS:我看一下cx_Oracle的源代码,它是在线上的seeionpool.c
status = OCISessionRelease(connection->handle,
connection->environment->errorHandle, NULL, 0, mode);
任何想法如何解决?
PPS:OS Windows XP和2008R2
答案 0 :(得分:1)
http://cx-oracle.sourceforge.net/html/session_pool.html
注意此对象是DB API的扩展,仅在Oracle 9i中可用。
答案 1 :(得分:1)
昨天我有同样的症状:在一个带有会话池的多线程应用程序中,有时释放会话会挂起最多2分钟。
您可能遇到以下Oracle错误之一:
错误10157313 - 使用OCI会话池时,CPU使用率过高,OCISessionRelease性能不佳(Doc ID 10157313.8)
错误10157313:OCI会话池增加CPU使用率并在使用11.2时花费更长时间
详见Oracle Metalink。
将Oracle客户端软件更新到11.2.0.3或更高版本(例如InstantClient 11.2.0.3)似乎有所帮助。