为了账号安全,请及时绑定邮箱和手机立即绑定

在线程或进程之间共享 cx_Oracle 游标

在线程或进程之间共享 cx_Oracle 游标

蓝山帝景 2021-11-23 16:18:13
我在 Oracle 中有一个数据库。我需要导出一些数据,处理它们并将数据保存到文件中。表中是 oracle sdo_geom,我需要将几何图形转换为WKT 格式。几何体真的很大,有数千个顶点的大多边形。我正在使用SDO_UTIL.TO_WKTGEOMETRY()函数,但它花费的时间太长。在这种情况下,选择(转换几何)到数据库中是一个瓶颈。我考虑了Python 中的多线程或多处理。该场景应如下所示:创建到数据库的连接创建 cx_Oracle.cursor然后启动多个共享游标的线程或进程在每个线程(或进程)中,我将按块从数据库(同一个表)中选择数据然后将所有数据发送到负责处理数据并保存到文件的线程或进程我正在使用fetchmany()通过块选择数据:def get_row_chunks(self):    while True:        rows = self.cursor.fetchmany()        if not rows:            break        yield rows所以我的问题是,是否可以使用多线程或多处理来解决这个问题,以及如何(使用cx_Oracle)或psycopg2 for PostgreSQL 我认为这并不重要。我认为光标在这些库中具有相同的行为。或者不可能在线程或进程之间轻松共享游标。可能的解决方案是在数据库中预生成 WKT 几何,但这在我看来是更通用的解决方案。
查看完整描述

1 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

您不能同时对 cx_Oracle 中的一个游标或连接执行多个操作。因此,例如,您不能同时进行提取。如果您尝试这样做,您会发现 fetches 阻塞。因此,我建议您只需在一个线程中执行提取并将提取的数据传递给另一个线程或多个线程进行处理。

另一种可能性是创建一个池,它允许您创建多个连接并在多个线程中使用它们(在创建池时使用 threaded=True 参数)。然后,您可以使用每个连接来查询数据的不同部分。


查看完整回答
反对 回复 2021-11-23
  • 1 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信