我們有一個使用txpostgres訪問postgres數據庫的RESTful(-ish)扭曲應用程序。目前,每次客戶端爲服務器調用db調用時,我們都會生成新的txpostgres.Connection
實例。這是低效的,並導致我們的db很快變得不知所措。我一直在嘗試改編,以代替txpostgres.ConnectionPool
,但遇到了麻煩。現在我有一些看起來像這樣:共享一個txpostgres連接池
class DBTester(object):
def __init__(self):
self.cfg = load_config('local') # load the db settings from a JSON file
self.pool = ConnectionPool(None, min=1, **self.cfg) # create the pool
@defer.inlineCallbacks
def get_pool(self):
yield self.pool.start()
defer.returnValue(self.pool)
class DBT(object):
def __init__(self):
self.db = DBTester()
@defer.inlineCallbacks
def t(self):
conn = yield self.db.get_pool()
res = yield conn.runQuery('select * from clients')
println('DBT.t result: {}'.format(res))
if __name__ == "__main__":
dbt = DBT()
dbt.t()
dbt.t()
reactor.run()
的問題是pool.start()
通話的時間。如果我把它放在DBTester.__init__
,我得到psycopg2.OperationalError: asynchronous connection attempt underway
。如果我把它放在DBTester.get_pool
中,一個db.t()
通話有效,另一個通過exceptions.AttributeError: 'NoneType' object has no attribute 'runQuery'
失敗。基本上我整天都在苦苦掙扎,並且一直無法破解它,也沒有能夠在網上找到很多東西。
我真的只需要一個指針,指向如何使用ConnectionPool
的一些最簡單的例子。有什麼建議麼?
爲什麼你在DBTester類中有池?這是有原因的嗎? – brunsgaard 2014-10-03 13:42:25