Каковы последствия открытия соединений MySQL снова и снова в PHP - PullRequest
4 голосов
/ 23 июня 2010

В частности, у меня есть класс DB, который открывает и закрывает несколько соединений MySQL каждый раз, когда я вызываю функцию Query в классе.Должен ли я открыть соединение один раз?или это нормально, чтобы открывать и закрывать соединения, как это?

Ответы [ 7 ]

3 голосов
/ 23 июня 2010

Мое простое (ISAM, без транзакций) приложение на языке C работает восемь часов в день, обновляя несколько таблиц в одной базе данных через одно соединение MySQL, которое остается открытым все время.Работает просто отлично.Каждый раз, когда возникает какая-либо ошибка MySQL (не только сервер пропал), код просто снова вызывает mysql_real_connect (), и он без проблем срабатывает.Переподключение - это одно из мест, где, на мой взгляд, MySQL функционирует безупречно.

Но существует множество споров и дискуссий о достоинствах и недостатках постоянных соединений.Вы можете найти некоторые из них здесь:

http://www.google.com/webhp?hl=&sourceid=navclient-ff&rlz=1B3GGLL_enUS384US384&ie=UTF-8#rlz=1B3GGLL_enUS384US384&hl=en&source=hp&q=mysql+persistent+connection&aq=0&aqi=g4g-m5&aql=&oq=mysql+persistent+conn&gs_rfai=Ch2c6iCchTO3zG4i6MZ-i7JAOAAAAqgQFT9BAKCs&fp=ff274912d96214e6

- HTH

3 голосов
/ 23 июня 2010

Должен ли я открыть соединение один раз?

Нет.

Я думал, что было бы лучше освободить память

На самом деле, само подключение не потребляет память.
И - самая важная часть - вы не должны беспокоиться о таких мыслимых вещах.
Не принимать решения на основе пустых предположений.
Вот 2 простых правила, которым нужно следовать:

  1. Когда вы не знаете, что делать, делайте это самым общим способом, как это делают все.
  2. Делайте только необходимые вещи.Не пытайтесь предвидеть каждую проблему в будущем.Имейте дело только с существующими проблемами, а не с мыслимыми. Преждевременная оптимизация - корень всего зла , как было сказано.
3 голосов
/ 23 июня 2010

Если вы не хотите много менять вместо mysql_connect (), используйте mysql_pconnect () Таким образом, вы будете использовать открытое соединение.Но я бы согласился с @Sarfraz Ahmed - используйте его только один раз

2 голосов
/ 23 июня 2010

Должен ли я открыть соединение один раз?или это нормально, чтобы открывать и закрывать соединения, как это?

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

1 голос
/ 23 июня 2010

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

MySQL работает просто отлично, если держать его в покое. Не добавляйте сложность.

Кстати, вы пишете еще один уровень абстракции MySQL? Зачем? Этот вопрос является хорошим примером того, почему изобретать велосипед может быть рискованно.

0 голосов
/ 23 июня 2010

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

Registry::Set('DB', new Database());
$DB = Registry::Get('DB');
0 голосов
/ 23 июня 2010

при соединении также использует процессорное время.таким образом, если вы переподключаете около 8 раз на страницу, и у вас есть около 100 посетителей в день, которые посещают в среднем 5 страниц, у вас будет 8 * 100 * 5 = 4000 переподключений за один день.и это маленький сайт.Вы должны подумать о подключении только один раз или когда соединение теряется.это также как-то снизит ваш счет за электричество; -)

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