【发布时间】:2010-11-10 04:37:32
【问题描述】:
你好,我有一个多线程程序,所有线程都将在 oracle 上运行 D B。那么,sqlalchemy 是否可以在 oracle 上支持并行操作呢?
tks!
【问题讨论】:
标签: python sqlalchemy
你好,我有一个多线程程序,所有线程都将在 oracle 上运行 D B。那么,sqlalchemy 是否可以在 oracle 上支持并行操作呢?
tks!
【问题讨论】:
标签: python sqlalchemy
只要每个并发线程都有自己的会话,就可以了。尝试使用一个共享会话会遇到麻烦。
【讨论】:
OCI(oracle 客户端接口)有一个参数 OCI_THREADED,它具有连接互斥的效果,这样通过多个线程的并发访问是安全的。这可能是您看到的文档所指的设置。
cx_oracle,本质上是一个 Python->OCI 桥,使用关键字参数“线程”在其连接函数中提供对此设置的访问,在 http://cx-oracle.sourceforge.net/html/module.html#cx_Oracle.connect 中进行了描述。文档声明它默认为 False,因为它会导致“10-15% 的性能损失”,尽管没有提供此信息的来源(并且性能统计数据通常应被视为可疑)。
就 SQLAlchemy 而言,SQLAlchemy 提供的 cx_oracle 方言默认将此值设置为 True,在通过 create_engine() 设置引擎时可以选择将其设置回 False - 因此在该级别没有问题.
但除此之外,SQLAlchemy 推荐的使用模式(即每个线程一个会话,将连接保持在池中,并根据需要由函数签出)在任何情况下都阻止对连接的并发访问。因此,您可以关闭 create_engine() 上的“线程”设置,并在遵循常规使用模式的情况下享受可能有形的性能提升。
【讨论】: