У нас есть приложение RESTful (-ish), которое использует txpostgres для доступа к postgres db. В настоящее время мы генерируем новые экземпляры txpostgres.Connection
каждый раз, когда клиент связывает сервер для вызова db. Это неэффективно и приводит к тому, что наш 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