powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Достигнут максимальный размер пула. Как можно найти причину
12 сообщений из 12, страница 1 из 1
Достигнут максимальный размер пула. Как можно найти причину
    #39686501
D_A_S1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Над проектом работало очень много людей, в итоге в последнее время стала очень часто возникать ошибка - Достигнут максимальный размер пула.
Можно ли как то средствами Sql Server понять где мы не закрываем подключение?
...
Рейтинг: 0 / 0
Достигнут максимальный размер пула. Как можно найти причину
    #39686521
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте может поможет.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
exec sys.sp_who2
--or
select
    er.session_id
  , ses.STATUS
  , ses.login_name
  , ses.host_name
  , er.blocking_session_id
  , db_name(er.database_id) as [db_name]
  , er.command
  , object_name(st.objectid) as object_name
  , er.cpu_time
  , er.start_time
  , cast(getdate() - er.start_time as time) as elapsed_time
  , st.text as query
from sys.dm_exec_requests er
    outer apply sys.dm_exec_sql_text(er.sql_handle) st
    left join sys.dm_exec_sessions ses on ses.session_id = er.session_id
    left join sys.dm_exec_connections con on con.session_id = ses.session_id
where er.session_id > 50



А вообще вам надо бы код клиента подправить.
В идеале у вас должен быть один общий метод который открывает соединение выполняет запрос и закрывает его. Его нужно использовать во всех DA методах.


Вот вам примерчик на C#, думаю идея понятна. (PS: код тут написал, так что может содержать ошибки.)
Код: c#
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.
public static T ExecuteCommand(Func<SqlCommand,  T> action)
{
	using (var cnn = _cnnfactory.GetSqlClientConnection())
	using (var cmd = cnn.CreateCommand())
	{
		cnn.Open();
		
		return action(cmd);
		
		//cnn.Close(); вообще не обязательно явно закрывать соединение, будет вызван Dispose()
	}
}

public static List<T> ReadList<T>(this SqlCommand cmd, Func<DataReader, T> func)
{
	using (var reader = cmd.ExecuteReader())
	{
		var result = new List<T>();
		while (reader.Read())
		{
			result.Add(func(reader));
		}
		
		//reader.Close(); вообще не обязательно явно закрывать ридер, будет вызван Dispose()
		
		return result;
	}
}

// использование:
public List<Dto> GetSomeData()
{
	return ExecuteCommand(cmd => {
		cmd.CommandText = "select Id, Name from dbo.MyFavoriteTable";
		
		return cmd.ReadList(reader => new Dto {
			Id = reader.GetInt32("Id"),
			Name = reader.GetString("Name")
		});
	});
}
...
Рейтинг: 0 / 0
Достигнут максимальный размер пула. Как можно найти причину
    #39686725
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_A_S1,

емнип на C# клиенте надо вызывать не только клозе, но и дисконнект.
...
Рейтинг: 0 / 0
Достигнут максимальный размер пула. Как можно найти причину
    #39686749
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовD_A_S1,

емнип на C# клиенте надо вызывать не только клозе, но и дисконнект.
В каком классе и какой это метод?
...
Рейтинг: 0 / 0
Достигнут максимальный размер пула. Как можно найти причину
    #39686754
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Затуливетер
Код: c#
1.
//cnn.Close(); вообще не обязательно явно закрывать соединение, будет вызван Dispose()

Dispose будет автоматически вызван при вызове Finalize сборщиком мусора.
Вот так и получается превышение размера пула коннектов (или, если не повезёт, превышения не будет, но программа будет работать медленно).
документацияAlways call Dispose before you release your last reference to the Component. Otherwise, the resources it is using will not be freed until the garbage collector calls the Component object's Finalize method.
Нужно всегда явно закрывать соединение. Или хотя бы явно вызвать Dispose

Владимир ЗатуливетерВ идеале у вас должен быть один общий метод который открывает соединение выполняет запрос и закрывает его. Его нужно использовать во всех DA методах. Не то, что "в идеале", а абсолютно обязательно.
Это по моему понимает любой программист после первой написанной программы :-)
Потому что при малейшей правке приходится лазить по всему коду. Не говоря уже об ошибках из за описки или невнимательности.

Владислав Колосовемнип на C# клиенте надо вызывать не только клозе, но и дисконнект.Не, нету никакого "дисконнект", в классах доступа к БД это называется Close
...
Рейтинг: 0 / 0
Достигнут максимальный размер пула. Как можно найти причину
    #39686956
Диклевич Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgDispose будет автоматически вызван при вызове Finalize сборщиком мусора.

В интернетах пишут что это не так, и, цитирую Eric JThe connection is disposed immediately after going out of scope of the using statement. That has nothing to do with garbage collection.
...
Рейтинг: 0 / 0
Достигнут максимальный размер пула. Как можно найти причину
    #39686974
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диклевич АлександрalexeyvgDispose будет автоматически вызван при вызове Finalize сборщиком мусора.

В интернетах пишут что это не так, и, цитирую Eric JThe connection is disposed immediately after going out of scope of the using statement. That has nothing to do with garbage collection.Не знаю, может, это в новых версиях так работает?
Я процитировал документацию к .NET Framework, версии 3.5, 3.0, 2.0, 1.1, 1.0
И сам видел описанное мной поведение, но давно, много лет назад, когда ещё писал на C#

А, вот, Владимир Затуливетер использует using , а для неё вызов Dispose гарантируется, это я не учёл.
...
Рейтинг: 0 / 0
Достигнут максимальный размер пула. Как можно найти причину
    #39687015
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, Close() не обязательно вызывать т.к. ипользуется using в приведенном коде.
...
Рейтинг: 0 / 0
Достигнут максимальный размер пула. Как можно найти причину
    #39688731
D_A_S1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, пожалуйста. Ищу, где могут быть проблемы.

У меня есть вот метод, который заполняет объекты класса:

Код: c#
1.
2.
3.
4.
5.
using (var connection = DBModule.NewSqlConnection())
{
     var sql ="SELECT * FROM requestTransactions WHERE isDeleted = 0";
     return connection.Query<RequestTransaction>(sql).ToList();
}



Класс RequestTransaction имеет следующее:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public class RequestTransaction
{
           [Key]
           public int id { get; set; }

          [Write(false)]
          public string fromOffice =>  this.fromOfficeId != null ? Office.GetById(this.fromOfficeId ?? 0)?.nameOffice : "";

}



Класс Office имеет следующее:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 public class Office
{
       public static Office GetById(int id) {
            using (var connection = DBModule.NewSqlConnection())
            {
                var sql = "SELECT * FROM dic_company_offices WHERE id = @id";
                return connection.QueryFirstOrDefault<Office>(sql, new { id });           
            }
        }

}



У меня вопрос: первоначальный метод использует свое подключение и заполняет список RequestTransaction. У каждого объекта RequestTransaction нужно определить офис, для этого используется метод, где также идет открытие своего подключения к БД.
В таком случае будут ли корректно закрываться соединения? Получается что одно соединение вложено в другое
...
Рейтинг: 0 / 0
Достигнут максимальный размер пула. Как можно найти причину
    #39688829
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_A_S1,

Вы пишете приложение для одного пользователя или многопользовательское? Один тип источника поступления данных или несколько?
По коду уже видно, что приложение будет затруднительно сопровождать и развивать как многопользовательское или неавтономное.
По вопросам C# Вам лучше обратиться на специализированный форум.
...
Рейтинг: 0 / 0
Достигнут максимальный размер пула. Как можно найти причину
    #39688932
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_A_S1Подскажите, пожалуйста. Ищу, где могут быть проблемы.

У меня есть вот метод, который заполняет объекты класса:Мы же не видим ваш код (может, конечно, на форуме C# разобрались бы...)
Что у вас за DBModule.NewSqlConnection? Что у него за метод такой, Query?
Типами щас вообще не пользуются, везде "var", как в бейсике :-)
В общем, по фрагменту непонятно, как это работает.

Вам писали, как себя ведут классы SqlConnection из System.Data.SqlClient, но что там у вас - непонятно.
И ещё, вам советовали, как избежать таких ошибок в принципе, потому что даже если в приведённом коде ошибки нет, то весь код приложения представляет из себя адскую лапшу, в которой может затесаться непонятно что.

По поводу правильности конкретно этого кода - в общем достаточно сделать тестовую функцию с вызовами вашего кода, и посмотреть на сиквеле профайлером, закрываются ли коннекты, или нет (точнее, возвращаются ли они в пул).
...
Рейтинг: 0 / 0
Достигнут максимальный размер пула. Как можно найти причину
    #39689147
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
public string fromOffice =>  this.fromOfficeId != null ? Office.GetById(this.fromOfficeId ?? 0)?.nameOffice : "";



Вот так не делайте, это вообще "кривой" подход.
На каждую вашу транзакцию (RequestTransaction) будете дергать Office.GetById.
Это очень тормознуто и затратно по ресурсам.

Вот так надо:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
using (var connection = DBModule.NewSqlConnection())
{
     var sql = @"
select rt.*, o.nameOffice as fromOffice 
from requestTransactions rt
    left join dic_company_offices o on o.Id = rt.office_id
where rt.isDeleted = 0
";
     return connection.Query<RequestTransaction>(sql).ToList();
}

//и

public class RequestTransaction
{
           [Key]
           public int id { get; set; }

          [Write(false)]
          public string fromOffice { get; set; }
}
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Достигнут максимальный размер пула. Как можно найти причину
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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