python sqlalchemy 并行操作

0 投票
2 回答
2415 浏览
提问于 2025-04-15 12:51

你好,我有一个多线程的程序,所有线程都会操作Oracle数据库。那么,sqlalchemy能支持在Oracle上进行并行操作吗?

谢谢!

2 个回答

1

只要每个同时运行的线程都有自己的会话,你就没问题。问题出在试图使用一个共享的会话上,这样就会出错。

4

OCI(Oracle客户端接口)有一个参数叫做OCI_THREADED,这个参数的作用是让多个线程同时访问数据库时是安全的,因为它会对连接进行互斥处理。这可能就是你看到的文档提到的设置。

cx_oracle,可以理解为Python和OCI之间的桥梁,它在连接函数中提供了这个设置的访问方式,使用的关键字参数是“threaded”。具体可以查看这个链接:http://cx-oracle.sourceforge.net/html/module.html#cx_Oracle.connect。文档中提到默认情况下这个参数是False,因为这样会导致“10-15%的性能损失”,不过没有提供这个信息的来源(而且一般来说,性能数据都要谨慎对待)。

至于SQLAlchemy,SQLAlchemy自带的cx_oracle方言默认将这个值设置为True,但在通过create_engine()设置引擎时,你可以选择将其改回False,所以在这个层面上没有问题。

不过,SQLAlchemy推荐的使用方式(也就是每个线程一个Session,保持连接在一个池中,按需由函数取出)本身就避免了对同一个连接的并发访问。因此,你可以在create_engine()中关闭“threaded”设置,只要遵循常规的使用模式,可能会享受到更明显的性能提升。

撰写回答