如何避免每次实例化`ZHOracle`都创建一个新的pool?
时间: 2024-09-24 20:28:00 浏览: 34
为了避免每次实例化`ZHOracle`类就创建一个新的连接池,你可以将pool的创建移至类初始化之外,将其作为类属性。这样,每当有新实例创建时,只需要访问并复用已经存在的连接池。以下是修改后的代码:
```python
import cx_Oracle
import json
from contextlib import closing
class ZHOracle:
_pool = None # 将pool变量改为类属性
def __init__(self):
if not ZHOracle._pool: # 如果_pool还没创建,则初始化
with open('./zhoracle.json', 'r', encoding='utf8') as fp:
config = json.load(fp)
ZHOracle._pool = cx_Oracle.SessionPool(
user=config['user'],
password=config['password'],
dsn=config['dsn'],
min=2,
max=5,
increment=1,
getmode=cx_Oracle.SPOOL_ATTRVAL_USE,
encoding="UTF-8"
)
@classmethod
def get_conn_and_cursor(cls):
conn = None
try:
with closing(cls._pool.acquire()) as conn:
cs = conn.cursor()
return cs
except (IOError, cx_Oracle.DatabaseError) as e:
print(f"Error connecting to Oracle: {str(e)}")
return None
# 使用方式
oracle = ZHOracle()
with ZHOracle.get_conn_and_cursor() as cs:
# 执行SQL或其他操作
```
现在,每次创建`ZHOracle`实例时,只要第一次,就会初始化连接池。后续的实例只需调用`get_conn_and_cursor`方法即可。
阅读全文