cx Oracle資料庫連線池使用

2021-10-06 07:27:40 字數 2198 閱讀 3355

官方**介紹:

官網上的介紹比較詳細,也比較清晰。使用起來非常方便。

from contextlib import contextmanager

import cx_oracle

import os

oracle_config =

os.environ['nls_lang'] = 'simplified chinese_china.utf8'

class reallyoracleconnectionpool(cx_oracle.sessionpool):

""" 使用訊號量來控制連線池數,是因為測試中使用cx_oracle.sessionpool出現了部分執行緒丟失連線的情況 """

def __init__(self, *args, **kwargs):

pool_size = kwargs.get('max', 10)

self._semaphore = semaphore(pool_size)

super().__init__(*args, **kwargs)

def get_connection(self, *args, **kwargs):

self._semaphore.acquire()

return super().acquire(*args, **kwargs)

def put_connection(self, *args, **kwargs):

super().release(*args, **kwargs)

self._semaphore.release()

# cnxpool = cx_oracle.sessionpool(oracle_config['username'], oracle_config['password'], oracle_config['hosts'], min=10,

# max=10, increment=0, threaded=true)

cnxpool = reallyoracleconnectionpool(oracle_config['username'], oracle_config['password'], oracle_config['hosts'],

min=10, max=10, increment=0, threaded=true)

@contextmanager

def get_cursor():

try:

# con = cnxpool.acquire()

con = cnxpool.get_connection()

cursor = con.cursor()

yield cursor

finally:

cursor.close()

# cnxpool.release(con)

cnxpool.put_connection(con)

class pyoracle(object):

"""建立python操作oracle類"""

@staticmethod

def get_all(sql):

with get_cursor() as cursor:

cursor.execute(sql)

return cursor.fetchall()

if __name__ == '__main__':

import time

from concurrent.futures import threadpoolexecutor

def t(n):

r = pyoracle.get_all("select * from table")

print(str(n) + str(r))

s = time.time()

with threadpoolexecutor(max_workers=15) as pool:

for i in range(5):

pool.submit(t, (i))

# for i in range(20):

# t(i)

print(time.time() - s)

對連線池的一般建議是使用固定大小的池。min和max的值應相同(且增量increment等於零)。不應使空閒會話期滿。這會降低吞吐量避免連線風暴。請參閱《防止連線風暴的指南:使用靜態池》,其中包含有關池大小調整的詳細資訊。

資料庫連線池 Redis連線池

基本原理 在內部物件池中,維護一定數量的資料庫連線,並對外暴露資料庫連線的獲取和返回方法。如外部使用者可通過getconnection方法獲取資料庫連線,使用完畢後再通過releaseconnection方法將連線返回,注意此時的連線並沒有關閉,而是由連線池管理器 並為下一次使用做好準備。2.作用 ...

資料庫連線池

實現資料連線池,讓系統有更高有執行效率 using system using system.data using system.data.sqlclient using system.collections using system.threading public class dataaccess...

資料庫連線池

資料庫連線池概述 資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得尤為突出。對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的效能指標。資料庫連線池正是針對這個問題提出來的。資料庫連線池負責分配 管理和釋放資料庫連線,它允許應用程式重複使用乙個現有...