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

问题描述 投票:0回答:1

我在Oracle中有一个数据库。我需要导出一些数据,处理它们并将数据保存到文件中。在表中是oracle sdo_geom,我需要将几何转换为WKT format。几何体非常大,有一千个顶点的大多边形。我正在使用SDO_UTIL.TO_WKTGEOMETRY()功能,但它需要太长时间。在这种情况下,选择(转换几何体)到数据库是一个瓶颈。

我想在Python中进行多线程或多处理。该场景应如下所示:

  1. 创建与数据库的连接
  2. 创建cx_Oracle.cursor
  3. 然后启动共享游标的多个线程或进程
  4. 在每个线程(或进程)中,我将按块从数据库(同一个表)中选择数据
  5. 然后将所有数据发送给负责处理数据并保存到文件的线程或进程

我通过chunk使用fetchmany()选择数据:

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

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

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

python multithreading multiprocessing psycopg2 cx-oracle
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.