官方**介紹:
官網上的介紹比較詳細,也比較清晰。使用起來非常方便。
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...
資料庫連線池
資料庫連線池概述 資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得尤為突出。對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的效能指標。資料庫連線池正是針對這個問題提出來的。資料庫連線池負責分配 管理和釋放資料庫連線,它允許應用程式重複使用乙個現有...