0

次のコードは Instant Client 10g では正しく動作しますが、Oracle Instant Client 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: OS Windows XP および 2008R2

4

2 に答える 2

1

昨日も同じ症状がありました。セッション プールを備えたマルチスレッド アプリケーションで、セッションを解放すると最大 2 分間ハングすることがあります。

次の Oracle バグのいずれかが発生している可能性があります。

バグ 10157313 - OCI セッション プーリングを使用すると、CPU 使用率が過剰になり、OCISessionRelease のパフォーマンスが低下する (Doc ID 10157313.8)

バグ 10157313 : 11.2 を使用すると、OCI セッション プーリングによって CPU 使用率が増加し、リリースに時間がかかる

詳細については、Oracle メタリンクを参照してください。

Oracle クライアント ソフトウェアを 11.2.0.3 以降 (InstantClient 11.2.0.3 など) に更新すると役立つようです。

于 2013-09-25T07:01:48.970 に答える
1

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

注 このオブジェクトは DB API の拡張機能であり、Oracle 9i でのみ使用できます。

于 2012-11-13T01:13:58.470 に答える