【问题标题】:cx_Oracle + oracle instance client 11g hang upcx_Oracle + oracle 即时客户端 11g 挂机
【发布时间】:2012-01-16 14:27:19
【问题描述】:

下一个代码在即时客户端 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源代码,它在seesionpool.c在线

    status = OCISessionRelease(connection->handle,
            connection->environment->errorHandle, NULL, 0, mode);

有什么办法解决吗?

PPS:操作系统 Windows XP 和 2008R2

【问题讨论】:

    标签: python oracle10g oracle11g cx-oracle instantclient


    【解决方案1】:

    http://cx-oracle.sourceforge.net/html/session_pool.html

    注意此对象是 DB API 的扩展,仅在 Oracle 9i 中可用。

    【讨论】:

      【解决方案2】:

      我昨天也有同样的症状:在带有会话池的多线程应用程序中,有时释放会话会挂起长达 2 分钟。

      您可能遇到以下 Oracle 错误之一:

      错误 10157313 - 使用 OCI 会话池时 CPU 使用率过高和 OCISessionRelease 性能不佳(文档 ID 10157313.8)

      错误 10157313:OCI 会话池会增加 CPU 使用率并在使用 11.2 时需要很长时间才能发布

      有关详细信息,请参阅 Oracle Metalink。

      将 Oracle 客户端软件更新到 11.2.0.3 或更高版本(例如 InstantClient 11.2.0.3)似乎有帮助。

      【讨论】:

        猜你喜欢
        • 2020-11-26
        • 2018-09-10
        • 1970-01-01
        • 2013-03-22
        • 1970-01-01
        • 2015-07-25
        • 1970-01-01
        • 2013-06-01
        • 1970-01-01
        相关资源
        最近更新 更多