0

我是烧瓶的新手。我需要在烧瓶中实现连接池,以下是我的软件堆栈: 1. Flask - 0.12.2 2. Python版本 - 3.4.3 3. Python couchbase驱动程序版本 - 2.2.1 4. Couchbase版本 - 4.5.0-2601 Community Edition(build-2601)连接在使用couchbase作为数据库的瓶中进行池化

我的要求是 - 在服务器启动时 - 在每'n'秒后重复运行3-4个进程,即某些进程每隔1秒运行一次,每5秒运行一次等等。我使用python中的“线程”模块来执行运行这些并行进程。 我不想创建&用于上述工艺紧密联系,所以创建所需的连接到couchbase桶在烧瓶如下启动: (下面的代码线是“app.py”文件)

cbBkt1Conn = Couchbase.connect(host=<host_name>, 
bucket=<bucket1>, password=<bucket1Password>) 
cbBkt2Conn = Couchbase.connect(host=<host_name>, 
bucket=<bucket3>, password=<bucket3Password>) 
cbBkt3Conn = Couchbase.connect(host=<host_name>, 
bucket=<bucket3>, password=<bucket3Password>) 

但是,当瓶3-4运行出现以下异常后启动:

File "/usr/local/lib/python3.4/dist-packages/couchbase/n1ql.py", line 384, 
in __iter__ 
    self._start() 
File "/usr/local/lib/python3.4/dist-packages/couchbase/n1ql.py", line 297, 
in _start 
cross_bucket=self._params.cross_bucket) 

couchbase.exceptions.ObjectThreadError: <Couldn't lock. If LOCKMODE_WAIT 
was passed, then this means that something has gone wrong internally. 
Otherwise, this means you are using the Connection object from multiple 
threads. This is not allowed (without an explicit lockmode=LOCKMODE_WAIT 
constructor argument, C Source=(src/oputil.c,428)> 

在进一步的调查,我发现,自从我使用相同的连接对象交流罗斯多线程,这是不允许的(按照上面的错误跟踪下面&链接):

http://docs.couchbase.com/sdk-api/couchbase-python-client-2.2.1/api/threads.html

的链接建议使用“线程”和“LOCKMODE_WAIT”选项,但这失败的全部目的。

我也碰到SQLAlchemy的,但是这并不支持couchbase

查询: 1)如何实现在瓶连接池? 请引导我一个例子/参考来实现这一点。

谢谢, Sachin Vyas。

回答

0

你最好在线程环境中创建新的连接。 (也许想想为什么你不想分享开始)。

最好把连接想象成一个旧式的房子线。如果有人在起居室接听并拨号,那么任何想在同一线路上打电话的人都将收到相同的对话。如果他拿起电话开始叫比萨饼,那么使用手机的人就会中断,他不会拿到比萨饼。

有两种选择:要么使用房子的第二个人需要等待线路空闲,或者为房子中的每个人开启新的连接。

+0

我会注意到,在Couchbase Python客户端中,我们在入口处解锁GIL,并且我们可以管道多个操作入队,认为IO循环在该特定情况下只驱动一次。通常与Couchbase,我们确实建议分享客户,但有很多因素。 –