Спящее состояние Sql server увеличивается с помощью ADO.NET-что?
Привет Эксперты,
У нас есть один живой жерех.Сетевое приложение, которое используется примерно 1000 одновременными пользователями. В этом приложении мы использовали пул соединений. Есть 2 строки подключения, определенные в web.config с разным именем, но мы вызываем одну и ту же БД.
<add name="connection1" connectionString="Data Source=mySQLServer;Initial Catalog=myDatabase;Integrated Security=True;Connection Timeout=300;Connection Lifetime=0;Min Pool Size=0;Max Pool Size=100;Pooling=true;" /> <add name="connection2" connectionString="Data Source=mySQLServer;Initial Catalog=myDatabase;Integrated Security=True;Connection Timeout=300;Connection Lifetime=0;Min Pool Size=0;Max Pool Size=100;Pooling=true;" />
В моем приложении мы открываем и закрываем соединение везде как показано ниже
try{ if (connection.State == ConnectionState.Closed) { connection.Open(); } } catch(Exception ex) { } finally{connection.close()}
Теперь проблема заключается в том, что когда я проверяю базу данных с помощью sp_who2, я вижу около 1000 или более спящих сеансов, и для каждой записи имя программы - ".Net sql server Provider". Я прошел через MSDN и обнаружил, что если мы используем пул соединений, то соединение остается открытым до 4-8 минут. Так что теперь я немного запутался, если я использую только 2 строки соединения с пулом соединений, то почему мы видим так много спящих соединений, я думаю, что это должно быть только 2? Может ли кто-нибудь помочь мне в этой ситуации и подсказать, что правильно? И как мы можем свести к минимуму сеансы сна.
Также не уверен, что это ошибка пула приложений(IIS server) или ошибка приложения?
Пожалуйста помочь.
Спасибо,
Что я уже пробовал:
Я также попытался проверить сервер приложений IIS 7. Я заметил, что по мере увеличения соединения приложение становится медленным, и нам нужно сделать рециркуляцию пула приложений.
Не уверен в точной причине, почему sp_who2 показывает несколько сеансов сна, если я использую только 2 пула, то сеанс сна должен быть 2, хотя я думаю, что не уверен.
Richard Deeming
Ваш код открытия и закрытия, похоже, предполагает, что Вы делитесь одним SqlConnection
объект вокруг - по крайней мере, в пределах одной страницы и, возможно, между запросами.
Вместо этого вы должны создать объект соединения в точке, когда он вам нужен, и обернуть его в using
блок. Пул соединений позаботится о повторном использовании закрытых соединений для вас.
using (SqlConnection connection = new SqlConnection("...")) { ... Code that uses the connection here ... }