Mysql Connection, один или много? - PullRequest
2 голосов
/ 23 декабря 2008

Я пишу скрипт на python, который в основном запрашивает WMI и обновляет информацию в базе данных mysql. Один из них «напиши, что тебе нужно», чтобы научиться программировать упражнения.

Если в середине скрипта что-то сломается, например, удаленный компьютер выключается, он разделяется на функции.

Запрос некоторых данных WMI
Обновите это до базы данных
Запросить другие данные WMI
Обновите это до базы данных

Лучше ли сначала открыть одно соединение mysql и оставить его открытым или закрыть соединение после каждого обновления?

Кажется, что одно соединение будет использовать меньше ресурсов. (Хотя я только учусь, так что это полное предположение.) Однако открытие и закрытие соединения с каждым обновлением кажется более «аккуратным». Функции будут более автономными, чем зависимыми от кода вне этой функции.

Ответы [ 4 ]

6 голосов
/ 23 декабря 2008

"Однако открытие и закрытие соединения с каждым обновлением выглядит более« аккуратно »."

Это также огромное количество накладных расходов - и нет никакой реальной выгоды.

Создание и утилизация соединений относительно дороги. Что еще более важно, какова реальная причина? Как это улучшить, упростить, уточнить?

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

2 голосов
/ 23 декабря 2008

Я не думаю, что есть "лучшее" решение. Пока рано думать о ресурсах. И поскольку wmi довольно медленный (по сравнению с SQL-соединением), db не является проблемой.

Просто заставь это работать. А потом сделай это лучше.

В работе с открытым соединением хорошо то, что «естественным» решением является использование объектов, а не только функций. Так что это будет опыт обучения (если вы изучаете python, а не mysql).

1 голос
/ 23 декабря 2008

Подумайте на минуту о следующем сценарии:

for dataItem in dataSet:
    update(dataItem)

Если вы откроете и закроете свое соединение внутри функции update , а ваш dataSet содержит тысячу элементов, то вы потеряете производительность своего приложения и потеряете все транзакционные возможности. 1008 *

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

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

Однако этот подход не подходит для выполнения массовых вставок или обновлений.

0 голосов
/ 23 декабря 2008

Полезные подсказки в ответах С. Лотта и Игала Сербана. Я думаю, что вы должны сначала узнать ваши фактические требования и код соответственно.

Просто чтобы упомянуть другую стратегию; некоторые приложения поддерживают пул соединений с базой данных (или что-то еще), а в случае транзакции просто извлекают пул из этого пула. Кажется довольно очевидным, вам просто нужно одно соединение для такого рода приложений. Но вы все равно можете сохранить пул одного соединения и применить следующее;

  • Всякий раз, когда требуется транзакция базы данных, соединение извлекается из пула и возвращается в конце.
  • (необязательно). Через некоторое время соединение прекращается (и заменяется новым).
  • (необязательно). Соединение прекращается после определенного использования.
  • (необязательно) Пул может проверить (отправив недорогой запрос), живо ли соединение, перед тем, как передать его программе.

Это что-то среднее между одно соединение и соединение на транзакцию стратегия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...