|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
Есть прога, которая работает круглыми сутками, мониторя данные и высылая их на удаленный MySQL - сервер. Прога работает на многих компах. Интенсивность запросов довольно большая. С базой также работает сайт. Где-то раз в месяц возникает ситуация, когда все внезапно перестает работать, а попытка зайти на сайт кончается сообщением PDOException: SQLSTATE[42000] [1226] User 'us_baranov_gaxx' has exceeded the 'max_user_connections' resource (current value: 30) in lock_may_be_available() Перезапуск прог на компах помогает (временно). Все запросы обернуты в код типа Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58.
Ну и где-то вызывается Код: sql 1. 2.
ConnectionString создается один раз и не меняется. Приложение многопоточное. Не могу понять, из-за чего проблема, куда смотреть? Может, где-то пропустил Connect без Dispose - да вроде нет, все просмотрел уже. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 16:59 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
Количество разных компов сильно меньше (3-5), чем 'max_user_connections' = 50 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 17:14 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
Pallaris, для начала нужно разобраться кто (программа или сайт) и сколько соединений держит. Затем уже решать что нужно исправлять. Если проблема в .NET коде, то придется искать места где соединения могут не закрываться. В первую очередь тебе нужно смотреть реализацию метода Connect() т.к. в случае исключения внутри него метод Dispose() - сюрприз! - вызван не будет. Дело в том что код using (DbConnection dbConn = Connect()) { ... } превращается в: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Можно попробовать запретить пул соединений добавив Pooling=False в строку соединения. Это будет означать что соединение будет открываться каждый раз заново и может а) привести к замедлению программы и б) привестт к риску налететь на ограничение по кол-ву соединений в час. Если ничего не поможет, тогда придется увеличить max_user_connections. PallarisКоличество разных компов сильно меньше (3-5), чем 'max_user_connections' = 50 Сообщение об ошибке говорит, что 30. 'us_baranov_gaxx' has exceeded the 'max_user_connections' resource (current value: 30) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 17:32 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
connection pooling ищите ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 17:36 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
Изопропилconnection pooling ищите Так я его нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 17:41 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
bazile В первую очередь тебе нужно смотреть реализацию метода Connect() т.к. в случае исключения внутри него метод Dispose() - сюрприз! - вызван не будет. Да там просто все Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 17:45 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
PallarisДа там просто все Ок. Теперь выясни кто именно (программа или сайт) держит много соединений. P.S. В коде есть ненужные приведения типов Код: c# 1. 2.
Можно без них написать т.к. язык выполняет неявное преобразование от дочернего класса к базовому. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 17:55 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
bazile, Могу предположить что это сайт. Если это IIS то он кеширует соединения. Даже если вы сделали Disconnect(). Уже подсказали: пул. Статический метод примерно такой ReleaseObjectPool() ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:00 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
voaУже подсказали: пул. Статический метод примерно такой ReleaseObjectPool() Я не понял, что вы имеете ввиду этим замечанием ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:05 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
voaМогу предположить что это сайт. Не надо гадать. Автору вопроса следует найти способ посмотреть список активных соединений на mysql. voaЕсли это IIS то он кеширует соединения. Похоже там Apache т.к. сайт на PHP. И, кстати, IIS не кеширует соединений с БД. Это делает код .NET. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:06 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
bazilevoaМогу предположить что это сайт. Не надо гадать. Автору вопроса следует найти способ посмотреть список активных соединений на mysql. Судя по всему, это прога. Я захожу в админку базы, делаю Код: sql 1.
Потом закрываю прогу на одном из хостов, и список сильно уменьшается. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:10 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
Pallaris, У вас IIS сервер? Если да, то он создает пул соединений "по своему усмотрению". Если в программе сервера все "правильно" сделано, я имею ввиду Disconnect-ы, то сервер всеравно держит соединение. Когда у меня резко возврастало количество коннектов к БД, я решил сбрасывать пул подключений. При этом жертвовал производительностью сервера на создание новых подключений при следующих запросах. Это лучше чем отказ сервера БД в подключении. Я подсказал метод, который сбрасывает пул подключений. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:15 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
у топикстартера MySql с хер знает каким провайдером ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:18 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
voaУ вас IIS сервер? Если да, то он создает пул соединений "по своему усмотрению". Хватит вводить людей в заблуждение. IIS не отвечает за пул соединений с базой. Это делают классы из .NET Framework. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:21 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
voa, а не может быть дело в транзакциях? Вот в этом коде: public void SafeExecuteQuery(string query_) { try { using (DbConnection dbConn = Connect()) { DbTransaction dbTransactUpdate = (DbTransaction)dbConn.BeginTransaction(); DbCommand sqlRequest = BuildCommand(query_, dbConn, dbTransactUpdate); sqlRequest.ExecuteNonQuery(); dbTransactUpdate.Commit(); } } catch (Exception ex) { streamOutput.OutputLog("DB_", "Error in SafeExecuteQuery with query:", query_ + "\n" + ex.ToString()); } } } Мол под каждую транзакцию создается свое соединение? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:21 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
Изопропилу топикстартера MySql с хер знает каким провайдером А какой должен быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:22 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
bazilevoaМогу предположить что это сайт. Не надо гадать. Автору вопроса следует найти способ посмотреть список активных соединений на mysql.. bazilevoaЕсли это IIS то он кеширует соединения. Похоже там Apache т.к. сайт на PHP. И, кстати, IIS не кеширует соединений с БД. Это делает код .NET. Согласен, только у меня строка подключения к БД разная и все кто обращасля к серверу создавали соединение которое оставалось "висеть". Вот я и сморозил о IIS ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:26 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
PallarisМол под каждую транзакцию создается свое соединение? Врядли, но что тебе мешает проверить? Поставьб точку останова до и после BeginTransaction и посмотри сколько соединений будет на сервере. Желательно, конечно, чтобы никто кроме тебя там не работал в этот момент. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:26 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
Pallarisvoa, а не может быть дело в транзакциях? Вот в этом коде: public void SafeExecuteQuery(string query_) { try { using (DbConnection dbConn = Connect()) { DbTransaction dbTransactUpdate = (DbTransaction)dbConn.BeginTransaction(); DbCommand sqlRequest = BuildCommand(query_, dbConn, dbTransactUpdate); sqlRequest.ExecuteNonQuery(); dbTransactUpdate.Commit(); } } catch (Exception ex) { streamOutput.OutputLog("DB_", "Error in SafeExecuteQuery with query:", query_ + "\n" + ex.ToString()); } } } Мол под каждую транзакцию создается свое соединение? Нет, транзакции - это комманды серверу БД чтобы сохранить целостность чего-то (несколько запросов). Выполняются в одном подключении (если вы специально не создаете отдельные подкючения на разные запросы) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:32 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
voa Нет, транзакции - это комманды серверу БД чтобы сохранить целостность чего-то (несколько запросов). Выполняются в одном подключении (если вы специально не создаете отдельные подкючения на разные запросы) В MSDN пишут (только у меня пока не хватает ума этого понять) Соединения выбираются из пула и назначаются в зависимости от контекста транзакции. Если в строке соединения не указан аргумент Enlist=false, пул соединений гарантирует прикрепление соединения к контексту Current. После закрытия и возврата соединения в пул с прикрепленной транзакцией System.Transactions оно резервируется таким образом, что следующий запрос к пулу соединений с той же транзакцией System.Transactions вернет это соединение, если оно доступно. Если при выдаче такого запроса в пуле нет доступных соединений, соединение берется и прикрепляется из части пула, не использующей транзакции. Если доступных соединений нет во всех частях пула, создается и прикрепляется новое соединение. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:39 |
|
MySQL количество подключений
|
|||
---|---|---|---|
#18+
PallarisConnectionString создается один раз и не меняется. Приложение многопоточное. ConnectionString - точно у всех подключениях одинаковый? Если хоть немного отличается, будет создаваться новое соединение. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2013, 18:41 |
|
|
start [/forum/topic.php?fid=20&msg=38270571&tid=1404641]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 312ms |
total: | 483ms |
0 / 0 |