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
相关产品推荐
相关产品推荐

