none
Как избегать To many connection при работе с MySQL БД RRS feed

  • Вопрос

  • Часто бывает, что при попытке загрузить данные из базы получаю исключение To many connection

    Я не знаю внутренних особенностей работы БД, поэтому не понимаю, что считается подключением, когда происходит отключение и т.д.

    Например: Если я работаю с 3-мя TableAdapter. Один для периодического обновления данных о пользователях. Второй постоянно (2-3 раза в секунду) проверяет наличие новых записей в таблице "Чат", а третий так же часто проверяет таблицу онлайн-пользователей.

    Так вот возникают ситуации, когда копий программы запущенно не так уж и много, а ошибка To many connection все равно возникает. Хотелось бы понять - она возникает в результате моего нерадивого программирования или это все то же проблема со стороны сервера?


    Влюблен в WPF
    • Изменено LXGDARK 7 октября 2011 г. 18:28
    7 октября 2011 г. 18:27

Ответы

  • Как выяснилось, в моем случае была совокупность проблем:

    - разрешено всего 25 одновременных подключений к серверу (сейчас увеличено)

    - циклическое обращение методами вроде TableAdapter.Fill (2-3 раза в секунду) который открывает соединение и сразу его закрывает, но сервер не успевал это все переварить, и держал соединения открытыми чуть дольше.

    Обе проблемы сейчас устранены, и из этой ситуации сделан вывод - если вам нужно не прерывное обновление данных у кучи клиентских приложений, то использование БД для этого не очень подходит, лучше писать приложение Сервер...


    Влюблен в WPF
    • Помечено в качестве ответа LXGDARK 11 октября 2011 г. 4:59
    11 октября 2011 г. 4:58

Все ответы

  • Выяснил у администратора сервера, что мне нужно при начале работы с БД открывать соединения, и при окончании закрывать. На MSDN же вычитал, что TableAdapter.Fill открывает соединение и сразу закрывает. Именно такое количество открытий и закрытий приводит к To many connection

    Как открыть соединение один раз при запуске программы, затем по ходу работы программы выполнять запросы в пределах этого соединения и после закрытия программы закрыть и соединение?

    Таким образом один сеанс работы пользователя = одно соединение с сервером.

    И еще вопрос - если у меня сейчас 4 разных Tableadapter, то каждый из них создает по одному соединению? то есть минимум 4 соединения на одного клиента?


    Влюблен в WPF
    8 октября 2011 г. 14:52
  • Вместо TableAdapter'ов можно загружать данные в DataSet используя DataAdapter'ы. Тогда у для SelectCommand.Connection можно указать уже открытое соединение.
    10 октября 2011 г. 18:50
    Модератор
  • Как выяснилось, в моем случае была совокупность проблем:

    - разрешено всего 25 одновременных подключений к серверу (сейчас увеличено)

    - циклическое обращение методами вроде TableAdapter.Fill (2-3 раза в секунду) который открывает соединение и сразу его закрывает, но сервер не успевал это все переварить, и держал соединения открытыми чуть дольше.

    Обе проблемы сейчас устранены, и из этой ситуации сделан вывод - если вам нужно не прерывное обновление данных у кучи клиентских приложений, то использование БД для этого не очень подходит, лучше писать приложение Сервер...


    Влюблен в WPF
    • Помечено в качестве ответа LXGDARK 11 октября 2011 г. 4:59
    11 октября 2011 г. 4:58
  • Спасибо за то, что написали решение проблемы. Это будет полезно тем, кто столкнется с подобным.


    Для связи [mail]
    24 октября 2011 г. 22:32