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

Sharing cx_Oracle cursor between threads or processes

我在 Oracle 中有一个数据库。我需要导出一些数据,处理它们并将数据保存到文件中。在 table 中是 oracle sdo_geom and I need convert the geometry into the WKT format. The geometry is really big, a big polygons with thousand of vertices. I am using SDO_UTIL.TO_WKTGEOMETRY() 函数,但它花费的时间太长。在这种情况下,选择(转换几何)到数据库中是一个瓶颈。

我考虑 多线程多处理 在 Python。该场景应如下所示:

  1. 创建数据库连接
  2. 创建cx_Oracle.cursor
  3. 然后启动多个共享游标的线程或进程
  4. 在每个线程(或进程)中,我将 select 来自数据库的数据(相同 table)
  5. 然后所有数据将被发送到负责处理数据并保存到文件的线程或进程

我正在 select 通过块使用 fetchmany() 处理数据:

def get_row_chunks(self):
    while True:
        rows = self.cursor.fetchmany()
        if not rows:
            break
        yield rows

所以我的问题是,是否可以使用多线程或多处理来解决这个问题以及如何解决(对于 PostgreSQL 使用 cx_Oracle) or psycopg2 我认为这无关紧要。我认为游标在这些库中具有相同的行为。或者是否不可能在线程或进程之间轻松共享游标。

可能的解决方案是在数据库中预生成 WKT 几何体,但在我看来这更通用。

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

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