Использование rpyc для однократного подключения к базе данных и обслуживания нескольких запросов - PullRequest
2 голосов
/ 06 ноября 2011

Попытка подать результаты запроса к базе данных для клиентских запросов adhoc, но не хочет открывать соединение для каждого отдельного запроса.Я не уверен, правильно ли я это делаю.

Текущее решение - это что-то вроде этого на стороне "сервера" (сильно сокращено для ясности):

import rpyc
from rpyc.utils.server import ThreadedServer
import cx_Oracle

conn = cx_Oracle.conect('whatever connect string')
cursor = conn.cursor()

def get_some_data(barcode):
    # do something
    return cursor.execute("whatever query",{'barcode':barcode})

class data_service(rpyc.Service):
   def exposed_get_some_data(self, brcd):       
       return get_some_data(brcd)


if __name__ == '__main__':
   s = ThreadedServer(data_service, port=12345, auto_register=False)
   s.start()

Это работаетхорошо на некоторое время.Однако время от времени происходит сбой программы, и до сих пор я не смог отследить, когда она это сделает.

Что я хочу подтвердить, так это посмотреть, как соединение с базой данных создается вне класса data_service.Это само по себе может вызвать проблемы?

Большое спасибо за любые мысли оценили.

1 Ответ

1 голос
/ 06 ноября 2011

Не думаю, что проблема в том, что вы создаете соединение вне класса, это должно быть хорошо.

Я думаю, что проблема в том, что вы создаете только один курсор и используете его в течение длительного времени, что, насколько я понимаю, не означает, что курсоры должны использоваться.

Вы можете использовать conn.execute, не создавая курсор вручную, что должно быть хорошо для использования базы данных. Если я правильно помню, за кулисами это создает новый курсор для каждой команды SQL. Вы также можете сделать это самостоятельно в get_some_data(): создать новый курсор, использовать его один раз, а затем закрыть его перед возвратом данных.

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

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

...