You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多进程传递含Oracle连接的类实例报错求助

解决方案:多进程传递数据库连接实例报错问题

问题原因

数据库连接对象(如oracledb的Connection)关联着进程专属的网络套接字资源,这类对象无法被pickle序列化,而Python多进程间传递参数必须经过序列化,直接传递包含连接的Oracle_import实例必然报错。

可行方案:每个子进程独立创建连接

不要在主进程中建立连接后传递给子进程,而是将连接配置参数传给子进程,让子进程内部自行初始化连接和Oracle_import实例。

修改后的代码示例:

import oracledb
import multiprocessing

class Oracle_import:
    def __init__(self, connection, table_name, columns):
        self.connection = connection
        self.table_name = table_name
        self.columns = columns

def insertInOracle_worker(conn_params, table_name, columns):
    # 子进程内部独立创建数据库连接
    dsn = f'{conn_params["username"]}/{conn_params["userpwd"]}@{conn_params["host"]}:{conn_params["port"]}/{conn_params["service_name"]}'
    o_connection = oracledb.connect(dsn)
    oracle_import = Oracle_import(o_connection, table_name, columns)
    
    # 此处添加你的业务逻辑,例如:
    print(type(oracle_import))
    
    # 子进程结束前关闭连接,避免资源泄漏
    o_connection.close()

if __name__ == "__main__":
    # 整理数据库连接配置参数
    conn_params = {
        "username": "XXXXX",
        "userpwd": "XXXXX",
        "host": "xxxxx.corporate.co",
        "port": 1521,
        "service_name": "servicexxxx"
    }
    list_of_columns = [['MEMBER_TYPE', 'CHAR', 1]]
    table_name = "DISCOUNT_PROFILE"
    
    # 传递配置参数而非已建立的实例给子进程
    p1 = multiprocessing.Process(
        target=insertInOracle_worker,
        args=(conn_params, table_name, list_of_columns)
    )     
    p1.start()
    p1.join()  # 可选:等待子进程执行完毕

额外注意事项

  • 禁止在多个进程间共享同一个数据库连接:连接是进程专属资源,跨进程共享会引发并发访问错误、连接状态混乱等问题。
  • 若频繁创建子进程,可使用oracledb内置的连接池(oracledb.SessionPool)优化连接创建开销,但需确保每个子进程独立从池获取连接。
  • 子进程执行完毕后务必关闭连接,避免数据库端残留无效连接占用资源。

内容的提问来源于stack exchange,提问作者ProgrammerSk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:16:15