cx_Oracle + экземпляр клиента oracle 11g положи трубку - PullRequest
0 голосов
/ 09 декабря 2011

следующий код работает правильно с мгновенным клиентом 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: ОС Windows XP и 2008R2

Ответы [ 2 ]

1 голос
/ 25 сентября 2013

У меня вчера были те же симптомы: в многопоточном приложении с пулом сеансов иногда освобождение сеанса зависает на срок до 2 минут.

Возможно, вы столкнулись с одной из следующих ошибок Oracle:

Ошибка 10157313 - Чрезмерное использование ЦП и низкая производительность OCISessionRelease при использовании пула сеансов OCI (ID документа 10157313.8)

Ошибка 10157313: ПУЛИРОВАНИЕ OCI-СЕССИИ УВЕЛИЧЕНИЕ ИСПОЛЬЗОВАНИЯ ЦЕЛЕЙИСПОЛЬЗОВАНИЕ 11.2

Подробнее см. Oracle Metalink.

Обновление клиентского программного обеспечения Oracle до 11.2.0.3 или более поздней (например, InstantClient 11.2.0.3), похоже, помогает.

1 голос
/ 13 ноября 2012

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

Примечание. Этот объект является расширением API БД и доступен только в Oracle 9i.

...