在Oracle数据库中,我们经常需要使用Python来连接数据库进行数据处理和操作。
然而,如果大量的连接和断开会降低性能,这时候连接池就可以派上用场了。
连接池是一组已经初始化的数据库连接对象,这些连接对象可以供一个线程使用,
线程使用完成后不需要断开连接,而是将连接放回池中,等待下一个请求。这种方式提供了更高的性能和可伸缩性。
本文将介绍如何使用CX_Oracle连接池,让数据库操作更加高效。
# oracle 连接池,用户名、密码、连接地址、连接池中需要维护的最小连接数,SMESDB_Rp服务名称,连接池中需要维护的最大连接数,threaded=True支持多线程
SMESDB_RO_POOl = cx_Oracle.SessionPool("M6666SERTO", "1235484887",
"176.21.20.18:1621/SMESDB_Rp", min=10, max=60, increment=1, threaded=True, encoding="UTF-8", getmode=cx_Oracle.SPOOL_ATTRVAL_WAIT,)
# 使用 通过pool.acquire()获取到一个连接对象SMESDB_RO_CONN,在完成数据的操作后,当离开上下文环境时,连接对象将自动关闭并返回到池中。
SMESDB_RO_CONN = SMESDB_RO_POOl.acquire()
# 获取游标,游标不仅作为Python与Oracle数据库通信的中介,还作为游标缓冲区并控制主机到服务器的通信。务必在使用完后将游标关闭。如果您不执行cursor.close(),则会严重影响应用程序性能,并使池中的连接数达到上限。
SMESDB_RO_CURSOR = SMESDB_RO_CONN.cursor()
# 执行查询sql
SMESDB_RO_CURSOR.execute(main_sql)
for result in SMESDB_RO_CURSOR: # 循环从游标获取每一行并输出该行。 遍历oracle的查询结果
des = SMESDB_RO_CURSOR.description
t = ",".join([item[0] for item in des])
table_head = t.split(',') # 查询表列名 用,分割
list_list = list(result)
dict_result = dict(zip(table_head, list_list))