HI,我有一个多线程程序,所有线程都可以在oracle上运行 D B。那么,sqlalchemy可以支持oracle上的并行操作吗?
TKS!
答案 0 :(得分:4)
OCI(oracle客户端接口)具有参数OCI_THREADED,其具有连接被互斥的效果,使得通过多个线程的并发访问是安全的。这很可能是您所看到的文件所指的设置。
cx_oracle
,本质上是一个Python-> OCI桥,使用http://cx-oracle.sourceforge.net/html/module.html#cx_Oracle.connect中描述的关键字参数“threaded”在其连接函数中提供对此设置的访问。文档声明它默认为False,因为它导致“10-15%的性能损失”,但是没有给出这些信息的来源(并且性能统计数据应该总是被怀疑地视为规则)。
就SQLAlchemy而言,SQLAlchemy提供的cx_oracle
方言默认将此值设置为True,并且可以通过create_engine()设置引擎时将其设置为False - 所以在那个级别上没有任何问题。
但除此之外,SQLAlchemy建议的使用模式(即每个线程一个会话,保持池本地连接,在需要时由函数检出它们)会阻止在任何情况下并发访问连接。因此,您可以关闭create_engine()上的“线程”设置,并在遵循常规使用模式的情况下享受可能有形的性能提升。
答案 1 :(得分:1)
只要每个并发线程都有自己的会话,你应该没问题。尝试使用一个共享会话是您遇到麻烦的地方。