Проверьте, занят ли соединение с базой данных, используя python - PullRequest
0 голосов
/ 19 марта 2019

Я хочу создать класс Database, который может создавать курсоры по требованию.Должна быть возможность использовать курсоры параллельно (два или более курсора могут сосуществовать), и, поскольку у нас может быть только один курсор на соединение, класс Database должен обрабатывать несколько соединений.

По соображениям производительности мы хотим максимально использовать соединения и избегать создания нового соединения каждый раз, когда создается курсор: при каждом запросе класс будет пытаться найти среди открытых соединений первоенезанятое соединение и используйте его.

Соединение все еще занято, пока курсор не используется.

Вот пример такого класса:

class Database:
    ...
    def get_cursos(self,query):
        selected_connection = None

        # Find usable connection
        for con in self.connections:
            if con.is_busy() == False: # <--- This is not PEP 249
                selected_connection = con
                break

        # If all connections are busy, create a new one
        if (selected_connection is None):
            selected_connection = self._new_connection()
            self.connections.append(selected_connection)


         # Return cursor on query
         cur = selected_connection.cursor()
         cur.execute(query)
         return cur

Однако, глядя на стандарт PEP 249 , я не могу найти никакого способа проверить, действительно ли используется соединение или нет.

Некоторые реализации, такие как MySQL, Connector предлагают способы проверить, имеет ли соединение все еще непрочитанное содержимое (см. здесь ), однако, насколько я знаю, они не являются частью PEP 249.

Есть ли способ добиться того, что описано ранее для любого API-интерфейса базы данных Python, совместимого с PEP 249?

1 Ответ

1 голос
/ 19 марта 2019

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

new_cursor = new_connection.cursor()
cursor.execute(new_query)

и вы хотели посмотреть, доступно ли это соединение для использования другим курсором. Вы могли бы быть в состоянии сделать что-то вроде:

if (new_cursor.rowcount == -1):
    another_new_cursor = new_connection.cursor()
    ...

Конечно, все это действительно говорит вам о том, что курсор еще ничего не выполнял с момента последнего закрытия. Он может указывать на выполненный курсор (и, следовательно, на соединение, которое было закрыто), или он может указывать на курсор, который был только что создан или присоединен к соединению. Другой вариант - использовать цикл try / catch, например:

try:
    another_new_cursor = new_connection.cursor()
except ConnectionError?: //not actually sure which error would go here but you get the idea.
    print("this connection is busy.")

Конечно, вы, вероятно, не хотите получать спам с распечатанными сообщениями, но вы можете делать в этом все, что захотите, кроме блока, бездействия в течение 5 секунд, ожидания передачи другой переменной, ожидания ввода пользователя и т. Д. Если вы ограничены PEP 249, вам придется делать много вещей с нуля. Есть ли причина, по которой вы не можете использовать внешние библиотеки?

РЕДАКТИРОВАТЬ: Если вы хотите выйти за пределы PEP 249, вот что может сработать, но оно может не подходить для ваших целей. Если вы используете библиотеку mysql python, вы можете воспользоваться методом is_connected.

new_connection = mysql.connector.connect(host='myhost',
                         database='myDB',
                         user='me',
                         password='myPassword')

...stuff happens...

if (new_connection.is_connected()):
    pass
else:
    another_new_cursor = new_connection.cursor()
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...