powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / MySQL количество подключений
22 сообщений из 22, страница 1 из 1
MySQL количество подключений
    #38270471
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть прога, которая работает круглыми сутками, мониторя данные и высылая их на удаленный 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.
public class DataBase
{
 public DataTable ReadDataToTable(string query_)
        {
            DataTable dt = null;
            try
            {
                using (DbConnection dbConn = Connect())
                {



                    DbCommand sqlRequest = BuildCommand(query_, dbConn);
                    sqlRequest.CommandType = CommandType.Text;
                    using (DbDataReader sqlDataReader = sqlRequest.ExecuteReader())
                    {
                        dt = new DataTable();
                        dt.Load(sqlDataReader);
                    }

                }

            }

            catch (Exception ex)
            {
                streamOutput.OutputLog("DB_", "Error in ReadData with query:", query_ + "\r\n" + ex.ToString());
                return null;
            }
        

            return dt;
        }

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());
            }


        }
}



Ну и где-то вызывается
Код: sql
1.
2.
DataTable someDt_ = DataBase.ReadDataToTable(SomeSelectQuery_);
DataBase.SafeExecuteQuery(SomeUpdateQuery_);



ConnectionString создается один раз и не меняется.

Приложение многопоточное.

Не могу понять, из-за чего проблема, куда смотреть? Может, где-то пропустил Connect
без Dispose - да вроде нет, все просмотрел уже.
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270499
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Количество разных компов сильно меньше (3-5), чем 'max_user_connections' = 50
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270537
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallaris, для начала нужно разобраться кто (программа или сайт) и сколько соединений держит. Затем уже решать что нужно исправлять.

Если проблема в .NET коде, то придется искать места где соединения могут не закрываться. В первую очередь тебе нужно смотреть реализацию метода Connect() т.к. в случае исключения внутри него метод Dispose() - сюрприз! - вызван не будет. Дело в том что код using (DbConnection dbConn = Connect()) { ... } превращается в:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
{
	DbConnection dbConn = Connect();
	try
	{
		// ...
	}
	finally
	{
		dbConn.Dispose();
	}
}



Можно попробовать запретить пул соединений добавив 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)
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270546
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
connection pooling ищите
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270558
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилconnection pooling ищите

Так я его нашел.
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270571
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile В первую очередь тебе нужно смотреть реализацию метода Connect() т.к. в случае исключения внутри него метод Dispose() - сюрприз! - вызван не будет.

Да там просто все

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
public override DbConnection Connect()
        {


            SqlConnection dbConn = new SqlConnection(connectionString_);
            dbConn.Open();
            return (DbConnection)dbConn;

        }
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270589
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisДа там просто все
Ок. Теперь выясни кто именно (программа или сайт) держит много соединений.

P.S. В коде есть ненужные приведения типов
Код: c#
1.
2.
DbTransaction dbTransactUpdate = (DbTransaction)dbConn.BeginTransaction();
return (DbConnection)dbConn;


Можно без них написать т.к. язык выполняет неявное преобразование от дочернего класса к базовому.
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270602
voa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
voa
Гость
bazile,

Могу предположить что это сайт. Если это IIS то он кеширует соединения. Даже если вы сделали Disconnect(). Уже подсказали: пул.
Статический метод примерно такой ReleaseObjectPool()
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270618
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voaУже подсказали: пул.
Статический метод примерно такой ReleaseObjectPool()

Я не понял, что вы имеете ввиду этим замечанием
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270620
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voaМогу предположить что это сайт.
Не надо гадать. Автору вопроса следует найти способ посмотреть список активных соединений на mysql.

voaЕсли это IIS то он кеширует соединения.
Похоже там Apache т.к. сайт на PHP. И, кстати, IIS не кеширует соединений с БД. Это делает код .NET.
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270630
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazilevoaМогу предположить что это сайт.
Не надо гадать. Автору вопроса следует найти способ посмотреть список активных соединений на mysql.


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

Код: sql
1.
show processlist



Потом закрываю прогу на одном из хостов, и список сильно уменьшается.
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270633
voa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
voa
Гость
Pallaris,

У вас IIS сервер? Если да, то он создает пул соединений "по своему усмотрению". Если в программе сервера все "правильно" сделано, я имею ввиду Disconnect-ы, то сервер всеравно держит соединение. Когда у меня резко возврастало количество коннектов к БД, я решил сбрасывать пул подключений. При этом жертвовал производительностью сервера на создание новых подключений при следующих запросах. Это лучше чем отказ сервера БД в подключении.
Я подсказал метод, который сбрасывает пул подключений.
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270642
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у топикстартера MySql с хер знает каким провайдером
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270645
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voaУ вас IIS сервер? Если да, то он создает пул соединений "по своему усмотрению".
Хватит вводить людей в заблуждение. IIS не отвечает за пул соединений с базой. Это делают классы из .NET Framework.
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270647
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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());
}


}
}


Мол под каждую транзакцию создается свое соединение?
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270648
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилу топикстартера MySql с хер знает каким провайдером

А какой должен быть?
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270655
voa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
voa
Гость
bazilevoaМогу предположить что это сайт.
Не надо гадать. Автору вопроса следует найти способ посмотреть список активных соединений на mysql..

bazilevoaЕсли это IIS то он кеширует соединения.
Похоже там Apache т.к. сайт на PHP. И, кстати, IIS не кеширует соединений с БД. Это делает код .NET.
Согласен, только у меня строка подключения к БД разная и все кто обращасля к серверу создавали соединение которое оставалось "висеть". Вот я и сморозил о IIS
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270656
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisМол под каждую транзакцию создается свое соединение?
Врядли, но что тебе мешает проверить? Поставьб точку останова до и после BeginTransaction и посмотри сколько соединений будет на сервере. Желательно, конечно, чтобы никто кроме тебя там не работал в этот момент.
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270670
voa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
voa
Гость
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());
}


}
}


Мол под каждую транзакцию создается свое соединение?

Нет, транзакции - это комманды серверу БД чтобы сохранить целостность чего-то (несколько запросов). Выполняются в одном подключении (если вы специально не создаете отдельные подкючения на разные запросы)
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270685
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voa
Нет, транзакции - это комманды серверу БД чтобы сохранить целостность чего-то (несколько запросов). Выполняются в одном подключении (если вы специально не создаете отдельные подкючения на разные запросы)

В MSDN пишут (только у меня пока не хватает ума этого понять)

Соединения выбираются из пула и назначаются в зависимости от контекста транзакции. Если в строке соединения не указан аргумент Enlist=false, пул соединений гарантирует прикрепление соединения к контексту Current. После закрытия и возврата соединения в пул с прикрепленной транзакцией System.Transactions оно резервируется таким образом, что следующий запрос к пулу соединений с той же транзакцией System.Transactions вернет это соединение, если оно доступно. Если при выдаче такого запроса в пуле нет доступных соединений, соединение берется и прикрепляется из части пула, не использующей транзакции. Если доступных соединений нет во всех частях пула, создается и прикрепляется новое соединение.
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270691
voa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
voa
Гость
PallarisConnectionString создается один раз и не меняется.

Приложение многопоточное.



ConnectionString - точно у всех подключениях одинаковый? Если хоть немного отличается, будет создаваться новое соединение.
...
Рейтинг: 0 / 0
MySQL количество подключений
    #38270696
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voa
ConnectionString - точно у всех подключениях одинаковый? Если хоть немного отличается, будет создаваться новое соединение.

Стопудово
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / MySQL количество подключений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]