2014-12-11 3 views
4

Я создал игровой сервер в Python, который подключается к db PostgreSQL, используя psycopg2. Я видел примеры, я видел, что, когда создается соединение с базой данных, необходимо закрыть соединение при завершении запросов, например, для каждого клиента:PostgreSQL + Python: Закрыть соединение

#create connection to db 
con = psycopg2.connect (database = 'testdb', user = 'janbodnar') 
cur = con.cursor() 
#process query 
. 
. 
. 
#close connection 
con.close() 

Хорошо, когда я начинаю свой сервер, у меня есть это:

Внутри моего класса

def __init __ (self): 
      #create connection to db 
      con = psycopg2.connect (database = 'testdb', user = 'janbodnar') 
      cur = con.cursor() 

# to all customers ... 
def query(self): 
      #process query, for example ... 
      cur.execute ("DROP TABLE IF EXISTS Cars") 
      #the connection never closes 

То есть, я использую тот же объект подключения для всех запросов от всех клиентов и никогда не закрывает соединение, это выглядит лучше, чем быть открытие и закрытие соединения для каждого клиента , мой сервер работает хорошо. вы думаете об этом? это хорошо сделано? не делать?. Спасибо

ответ

0

Я думаю, что ответ на этот вопрос довольно прост: пока общее количество подключенных клиентов одновременно не превышает установленную вами настройку вашего postgres, вы должны быть в порядке. В противном случае новые соединения не могут быть приняты.

+0

Спасибо за ваш ответ! – ProgNova

2

Это может сработать, но это плохо. Проблемы: как установить формат даты и времени для сеанса? Как обрабатывать транзакции? Временные таблицы? Как обрабатывать ошибки? См. Также: How can I pool connections using psycopg and gevent?

Для таких целей вы можете использовать пул соединений. Таким образом, когда вы начинаете с нового клиента (новое сетевое соединение), вы получаете соединение db из пула. После его использования вместо закрытия соединения вы отпускаете его, и он возвращается в пул. Теперь он может использоваться другим потоком.

Если ваше соединение каким-то образом сломано, оно может быть просто закрыто, а не возвращаться в бассейн. Каждый поток может использовать транзакцию, и вы можете изменить настройки сеанса, такие как формат даты и времени.

Я вижу, что есть http://initd.org/psycopg/docs/pool.html

PS В своих методах вы должны использовать self.con и self.cur.

0

@ Michał Niklas Спасибо за ваш ответ и спасибо за исправление self.con и self.cur, я забыл поставить «я».

Я разъясняю, что знаю очень мало серверов и баз данных.

Я намерен сделать это:

Моего сервер обрабатывает «нити» отдельные процессы для каждого пользователя, а затем, в каждом отдельном процессе думает открыть соединение для запросов клиентов, а затем закрыть эту связь, что-то вроде этого:

в моем классе: если новый запрос от client1 ... А «нить» для этого клиента, то запрос выполняется ...

def query (self): 
       #create connection to db for client1 
       con = psycopg2.connect (database = 'testdb', user = 'janbodnar') 
       cur = con.cursor() 
       #process query for client1, for example ... 
       cur.execute ("DROP TABLE IF EXISTS Cars") 
       #close connection for this client 
       con.close() 

, что они думают по этому поводу? мне кажется лучше. Я ценю предложения и поддержку.

Смежные вопросы