В последнее время делает проект, основанный на asp.net и SQLServer сайте и нашел сайт после запуска в течение некоторого времени, будет сообщено исключение:
Время ожидания истекло, однако для получения соединения из пула. Это может произойти, потому что все объединенные соединения были в использовании и был достигнут максимальный размер пула
Эта очевидная аномалия SQLServer подключения к базе данных пула превышает размер по умолчанию, по оценкам, будет забыто, где код выпущен DB ссылки.
Исследование и доступ к данным коды слоя теперь DBHelper, Так что теперь решены.
Обобщить что-то, записать его.
DBHelperA код:
общественный класс DBHelperA { общественная строка connStr = " 你的SQLServer数据库连接" ; общественного IDbConnection _conn; общественного IDbConnection Conn { получить { если (_conn == NULL ) { _conn = новый SqlConnection (connStr); } Вернуть _conn; } } }
ClassA код:
общественный класс ClassA: DBHelperA { общественного недействительными DoItFirst () { используя (Conn) { если (== Conn.State ConnectionState.Closed) { Conn.Open (); ЕЫпе (Conn.GetHashCode ()); } } } Общественного недействительными DoItSecond () { используя (штат Коннектикут) { если (Conn.State == ConnectionState.Closed) { Conn.Open (); ЕЫпе (Conn.GetHashCode ()); } } } }
ClassA создавать объекты и вызывать два метода:
общественности статической недействительным TestA () { для ( INT I = 1 , г < 200 ; я ++ ) { ClassA = новый ClassA (); a.DoItFirst (); a.DoItSecond (); ЕЫпе (я); } Console.ReadLine (); }
На первый взгляд, ничего больше кода для этой проблемы, но в перспективе, он будет () метод генерирует исключение в a.DoItSecond: ConnectionString свойство не инициализируется
Это происходит потому, что после выполнения метода DoItFirst (), используя оператор высвобожденные ресурсы Conn , занятые объектом, а объект Conn не пуст
Таким образом, при выполнении метода DoItSecond () не повторно создать объект Конн. Свинец также использовать объекты, которые были выпущены Conn ресурсов, чтобы открыть соединение с базой данных, что приводит к ненормальному возникновению
DBHelperB код:
общественный класс DBHelperB { общественная строка connStr = " 你的SQLServer数据库连接" ; общественного IDbConnection Conn { получить { вар сопп = новый SqlConnection (connStr); ЕЫпе (conn.GetHashCode ()); вернуться соед; } } }
ClassB код:
общественный класс ClassB: DBHelperB { общественного недействительными DoIt () { используя (Conn) { если (== Conn.State ConnectionState.Closed) { Conn.Open (); ЕЫпе (Conn.GetHashCode ()); } } } }
Создание объекта ClassB и вызвать метод:
общественная статическая пустота TestB () { для ( INT I = 1 ; г < 200 ; я ++ ) { ClassB б = новый ClassB (); b.DoIt (); ЕЫпе (я); } Console.ReadLine (); }
Исполнение бросает исключение:
На этой точке зрения сеанс связь базы данных найдены 100 соединений:
Это происходит потому, что метод DoIt, каждый раз, когда ссылка на объект Conn, возвращает новое соединение, используя открытый и освободить оператор не одни и те же объекты, Conn, в результате чего в базе данных создано множество соединений
DBHelperC код:
общественный класс DBHelperC { общественности Строка connStr = « Ваше соединение с базой данных SQLServer » ; }
Код ClassC:
общественного недействительными DoIt () { использованием ( вар Конн = новый SqlConnection (connStr)) { если (Conn.State == ConnectionState.Closed) { Conn.Open (); ЕЫпе (Conn.GetHashCode ()); } } }
ClassC создавать объекты и вызывать методы:
общественная статическая пустота TestC () { для ( INT I = 1 ; г < 200 ; я ++ ) { ClassC гр = новый ClassC (); c.DoIt (); ЕЫпе (я); } Console.ReadLine (); }
Выполнение кода, не сообщают о каких-либо аномалий. И база данных и только один сеанс
Поскольку каждый объект должен создать соединение с помощью выписки частей внутри, используя создание и выпуск одного и того же объекта.
Кроме того, из-за ConnectionString параметров бассейновой базы данных не указаны, то по умолчанию, чтобы включить пул соединений.
Так C # код объекта подключения создается и разрушается, не затрагивая объекты базы данных SQLServer.
Каждый код создает объект соединения, вызовите метод Open () для построения в первый раз, база данных также используются для пула соединений, что сессия
Теперь я ставлю строки в ложные пулы соединений
Первый раз через петлю, базы данных времени создания сеанса
После первого цикла из-за помощью заявления, сессия пошла
Второй цикл, снова создал новую дб сессию
Подводя итог:
Когда классы строительства DBHelper и уровень доступа к базе данных, необходимо обратить внимание, чтобы освободить объект подключения. В противном случае это приведет к связке базы данных недействительных сессии
Коды здесь, интересующиеся могут попробовать (подключение к базе данных в свой адрес SQLServer базы данных на нем):