我正在使用Python2.7、celeri和cx_Oracle来访问Oracle数据库。在
我创造了很多任务。每个任务都会通过cx Oracle运行一个查询。其中许多任务将同时运行。所有连接任务应该共享相同的数据库任务。在
如果我只启动一个任务,查询就会正确运行。但是,如果我启动多个查询,就会收到以下错误消息:[2016-04-04 17:12:43,846: ERROR/MainProcess] Task tasks.run_query[574a6e7f-f58e-4b74-bc84-af4555af97d6] raised unexpected: DatabaseError('',)
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 240, in trace_task
R = retval = fun(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 438, in __protected_call__
return self.run(*args, **kwargs)
File "/home/ric/workspace/dbw_celery/tasks.py", line 39, in run_query
column_names = get_column_names(oracle_conn, table_info["table_name"])
File "/home/ric/workspace/dbw_celery/utilities.py", line 87, in get_column_names
cursor.execute(query_str)
DatabaseError:
现在让我们看看我的代码。在
这是我的tasks.py文件,我在其中创建Oracle数据库连接,Celery实例,并定义我的任务,用户将说数据库连接:
^{pr2}$
这是我如何连接到utilities.py文件中的数据库:# utilities.py
def connect_to_db(db_user, db_password, db_host, db_port, db_name):
"""Connect to DB."""
connection_str = "%s/%s@%s:%s/%s" % (db_user, db_password, db_host, db_port, db_name)
try:
db_connection = cx_Oracle.connect(connection_str)
except cx_Oracle.DatabaseError:
logger.error("Couldn't connect to DB %s" % db_name)
return None
logging.info("Succesfully connected to the DB: %s" % db_name)
return db_connection
这是在另一个文件中定义的get_new_rows_function,查询在其中实际运行:#utilities.py
def get_new_rows(db_connection, table_info):
"""Return new rows inserted in a given table since last check."""
cursor = db_connection.cursor()
query_str = "SELECT * FROM {0}".format(table_info["table_name"])
cursor.execute(query_str)
new_rows = cursor.fetchall()
cursor.close()
return new_rows
我这样运行我的代码:celery -A tasks worker -B
为了使代码更易于理解,我尝试简化代码。在
我担心我得到的错误是由同时运行的不同任务和共享同一数据库连接引起的。他们同时执行死刑会被“搞混”之类的。在
在不同的芹菜任务之间共享数据库连接的正确方法是什么?在
有人知道我做错了什么吗?在