MySql соединение, я могу оставить его открытым? - PullRequest
12 голосов
/ 10 ноября 2009

Разумно ли держать соединение открытым на протяжении всего сеанса? Я создал приложение на C #, которое подключается к базе данных MySql, программа выполняет чтение и запись в нее, и приложение должно работать без остановок около 10 часов в день.

Есть ли риск того, что вы сохраните соединение открытым, вместо того, чтобы вызывать функцию close () каждый раз после того, как вы что-то вынули из базы данных, и открывать ее снова, когда вам нужно что-то новое?

Ответы [ 11 ]

9 голосов
/ 10 ноября 2009

Поскольку вы используете ADO.NET, вы можете использовать встроенные в ADO.NET возможности пула соединений . На самом деле, позвольте мне уточнить, что: вы должны всегда использовать встроенные возможности пула соединений ADO.NET. Таким образом вы получите среду выполнения .NET для прозрачного управления своими подключениями в фоновом режиме. Соединения будут оставаться открытыми некоторое время, даже если вы закрыли их и повторно используете, если откроете новое соединение. Это действительно быстрый материал.

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

Вам нужно создавать соединения локально только тогда, когда они вам нужны, так как они объединяются в фоновом режиме, поэтому при создании нового соединения нет лишних затрат:

using (var connection = SomeMethodThatCreatesAConnectionObject())
{
    // do your stuff here
    connection.Close(); // this is not necessary as
                        // Dispose() closes it anyway
                        // but still nice to do.
}

Вот как вы должны это делать в .NET.

9 голосов
/ 10 ноября 2009

Оставить соединение открытым на некоторое время можно, если:

  1. у вас не так много одновременных бездействующих соединений, что вы достигнете предела количества соединений MySQL;

  2. Вы не оставляете его открытым в течение часов , ничего не делая. Соединение MySQL по умолчанию wait_timeout составляет 8 часов; оставьте соединение неактивным на долгое время, и когда вы в следующий раз будете его использовать, вы получите ошибку «Сервер MySQL ушел».

0 голосов
/ 30 января 2010

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

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

0 голосов
/ 10 ноября 2009

Да, вы можете при условии:

  • Вы восстановите соединение, если потеряете соединение
  • Вы можете сбросить состояние соединения, если произойдет что-то странное
  • Вы обнаружите, «отключается» ли соединение, например, если истекло время ожидания брандмауэра

В основном это требует большого внимания к случаям отказа и правильному восстановлению; Подключение и отключение часто намного проще.

0 голосов
/ 10 ноября 2009

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

0 голосов
/ 10 ноября 2009

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

0 голосов
/ 10 ноября 2009

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

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

0 голосов
/ 10 ноября 2009

По моему мнению, не рекомендуется держать соединения открытыми. Другим аспектом, который говорит о закрытии соединений каждый раз, является масштабируемость. Теперь можно оставить его открытым, но что делать, если ваше приложение используется в два раза больше, чем количество пользователей. Это боль в шее, чтобы вернуться и изменить весь код. (я знаю, что сделал это: -)

0 голосов
/ 10 ноября 2009

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

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

0 голосов
/ 10 ноября 2009

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

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

Ваш выбор ^^

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