python多线程利用cx_oracle从AOracle数据库分批读取表数据,并插入BOracle数据库中
时间: 2024-01-06 08:07:14 浏览: 93
以下是一个简单的示例代码,可以实现从 A 数据库中读取表数据分批插入到 B 数据库中:
```python
import cx_Oracle
import threading
# A 数据库连接信息
A_HOST = 'localhost'
A_PORT = 1521
A_SID = 'ORCL'
A_USER = 'user'
A_PASSWORD = 'password'
# B 数据库连接信息
B_HOST = 'localhost'
B_PORT = 1521
B_SID = 'ORCL'
B_USER = 'user'
B_PASSWORD = 'password'
# 分批读取的大小
BATCH_SIZE = 1000
def read_from_a(start):
try:
conn_a = cx_Oracle.connect(f'{A_USER}/{A_PASSWORD}@{A_HOST}:{A_PORT}/{A_SID}')
cursor_a = conn_a.cursor()
cursor_a.execute(f"SELECT * FROM table_a WHERE id >= {start} ORDER BY id ASC")
rows = cursor_a.fetchmany(BATCH_SIZE)
while rows:
insert_to_b(rows)
start += BATCH_SIZE
rows = cursor_a.fetchmany(BATCH_SIZE)
except cx_Oracle.Error as error:
print('Error:', error)
finally:
cursor_a.close()
conn_a.close()
def insert_to_b(rows):
try:
conn_b = cx_Oracle.connect(f'{B_USER}/{B_PASSWORD}@{B_HOST}:{B_PORT}/{B_SID}')
cursor_b = conn_b.cursor()
cursor_b.executemany("INSERT INTO table_b VALUES (:1, :2, :3)", rows)
conn_b.commit()
except cx_Oracle.Error as error:
print('Error:', error)
finally:
cursor_b.close()
conn_b.close()
if __name__ == '__main__':
start = 0
threads = []
for i in range(10):
t = threading.Thread(target=read_from_a, args=(start,))
threads.append(t)
t.start()
start += BATCH_SIZE
for t in threads:
t.join()
```
这个示例代码定义了两个函数,`read_from_a()` 和 `insert_to_b()`,分别用于从 A 数据库中读取数据和向 B 数据库中插入数据。在 `read_from_a()` 函数中,使用 `fetchmany()` 方法分批读取数据,并调用 `insert_to_b()` 函数插入到 B 数据库中。在主函数中创建 10 个线程,每个线程从 A 数据库中读取一批数据并插入到 B 数据库中。
需要注意的是,这个示例代码仅作为参考,具体实现还需要根据实际场景进行调整,例如需要根据数据量大小和系统资源等情况确定分批大小,还需要进行线程间同步和互斥等处理。同时,对于数据库连接等资源,也需要进行合理的管理和释放,以避免资源浪费和泄漏等问题。
阅读全文