python sqlalchemy 并行操作
你好,我有一个多线程的程序,所有线程都会操作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”设置,只要遵循常规的使用模式,可能会享受到更明显的性能提升。