cx_Oracle + Oracle 11g 客户端实例挂起
下面的代码在使用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 '---------------------------------'
顺便说一下,我查看了cx_Oracle的源代码,问题出现在sessionpool.c的某一行。
status = OCISessionRelease(connection->handle,
connection->environment->errorHandle, NULL, 0, mode);
有没有人知道怎么解决这个问题?
另外,操作系统是Windows XP和2008R2。
2 个回答
1
我昨天也遇到了同样的问题:在一个多线程的应用程序中,使用会话池时,有时候释放会话会卡住,最长能达到2分钟。
你可能碰到了以下其中一个Oracle的bug:
Bug 10157313 - 在使用OCI会话池时,OCISessionRelease的CPU使用率过高和性能差(文档编号10157313.8)
Bug 10157313:在使用11.2版本时,OCI会话池导致CPU使用率增加,释放会话的时间变长
想了解更多细节,可以查看Oracle的Metalink。
把Oracle客户端软件更新到11.2.0.3或更高版本(比如InstantClient 11.2.0.3)似乎会有所帮助。
1
http://cx-oracle.sourceforge.net/html/session_pool.html
注意:这个对象是数据库API的一个扩展,只在Oracle 9i中可用。