[C #] зафиксировали необычное исследование, в отношении использования синтаксиса, сессия базы данных SQLServer, класс DBHelper

В последнее время делает проект, основанный на 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 базы данных на нем):

скачать

рекомендация

отwww.cnblogs.com/qfl-blog/p/11647129.html