使用cx_Oracle在多个进程之间共享数据库连接

时间:2016-03-29 08:17:14

标签: python oracle cx-oracle multiprocess

我第一次使用Python multiprocessing来启动一定数量的进程(8),以便在大量表(大约1000个表)上定期运行一些查询。

应定期运行每个查询。例如,每300秒。

当然,我想创建一个数据库连接池来共享这些进程之间的数据库连接。

正如您在下面的代码中看到的,我为每个表创建了一个进程。我使用cx_Oracle创建了一个池,并在进程开始执行查询之前使用acquire(),并在执行完它时使用release()

这大致是我现在所拥有的:

import cx_Oracle
import multiprocessing as mp


class OracleWatcher(mp.Process):
    """Oracle Data Base Watcher."""

    def __init__(self, process_config):
        """Initialisation."""
        self.table_name = process_config["table_name"]
        self.query_str = process_config["query_str"]
        self.check_interval = process_config["check_interval"]
        super(OracleWatcher, self).__init__()

    def run(self):
        """Run method. Executed when creating a Process."""
        db_connection = pool.acquire()

        result = self.run_my_query(self.table_name, self.query_str)

        pool.release(db_connection)

        time.sleep(self.check_interval)

        self.run()

        return


db_user = get_database("user")
db_pass = get_database("pass")
db_host = get_database("host")
db_port = get_database("port")
db_name = get_database("name")

dsn_str = cx_Oracle.makedsn(db_host, db_port, db_name)

max_pool_size = 8 # 8 processes can use the connection pool simultaneously
pool = cx_Oracle.SessionPool(user=db_user,
                             password=databases_info["DB1"]['pass'],
                             dsn=dsn_str,
                             min=min_pool_size,
                             max=max_pool_size,
                             increment=increment)

jobs = []
database_tables = get_database_tables()

for database_table in database_tables:

    table_config_dict = {}

    table_config_dict["check_interval"] = get_table_name()
    table_config_dict["check_interval"] = get_check_interval()
    table_config_dict["query_str"] = get_query_str()

    proc = OracleWatcher(table_config_dict)
    jobs.append(proc)
    proc.start()

for j in range(len(jobs)):
    jobs[j].join()

仅仅使用acquire()release()来共享进程之间的连接并且只允许其中的8个同时使用它就足够了吗?我错过了什么吗?我是否需要使用multiprocessing.Queue()

之类的内容

0 个答案:

没有答案