0

next code works correct with instant client 10g, but hang up when using oracle instant client 11g, hangs on 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: I take look into cx_Oracle source code, it's hands in seesionpool.c on line

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

Any ideas how to solve it?

PPS: OS Windows XP and 2008R2

Andrey Koltsov
  • 1,956
  • 6
  • 24
  • 43

2 Answers2

1

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

Note This object is an extension the DB API and is only available in Oracle 9i.

中哲 熊
  • 11
  • 1
1

I had the same symptoms yesterday: In a multi-threaded application with a session pool, sometimes releasing the session hangs for up to 2 minutes.

You are probably hitting one of the following Oracle bugs:

Bug 10157313 - Excessive CPU usage and poor performance of OCISessionRelease when using OCI session pooling (Doc ID 10157313.8)

Bug 10157313 : OCI SESSION POOLING INCREASE CPU USAGE AND TAKE LONG TO RELEASE WHEN USING 11.2

For details see Oracle Metalink.

Updating the Oracle client software to 11.2.0.3 or later (eg InstantClient 11.2.0.3) seems to help.

Community
  • 1
  • 1
hvb
  • 2,484
  • 1
  • 10
  • 13