Как я могу увеличить количество пользователей моей системы? - PullRequest
0 голосов
/ 10 мая 2009

У меня есть клиент-серверное приложение, которое зависит от базы данных MS SQL для внутреннего хранения, серверное приложение - это служба WCF TCP, которая обрабатывает запросы клиентов, выбирая из базы данных набор информации.

Служба настроена как PerSession и поддерживает 500 сеансов. На стороне клиента пользователь может открывать разные представления, у каждого представления есть объект моей службы (объект прокси), поэтому каждое представление является сеансом; В каждом представлении есть таймер потоков, который каждую секунду запрашивает данные с сервера, используя прокси-объект.

Приложение работает хорошо для небольшого числа пользователей с 8 представлениями, но когда я увеличиваю число, в SqlConnection возникает исключение тайм-аута. Открыто, поскольку в пуле соединений нет доступных соединений.

Существует сеанс / объект для каждого представления, поскольку служба WCF не является поточно-ориентированной; это зависит от однопоточного уровня доступа к базе данных, который использует SqlDataReaders и SqlAdapters.

Есть ли способ увеличить количество соединений с базой данных? кажется 800 это максимум !! С вашей точки зрения, как я могу увеличить количество пользователей?

Должен ли я изменить слой DB, сделать его многопоточным и сделать службу WCF одиночной? Я думаю, что это узкое место в дизайне (можете ли вы порекомендовать статью для многопоточности в ADO.net)

P.S:

можно ли заменить базу данных в памяти или на более быстрое хранилище?

Согласно ответам:

Я изменил бэкэнд-сервис, чтобы закрыть соединение для вызова метода, но я сталкиваюсь с той же проблемой, так как количество пользователей увеличивает задержку (более одной секунды), означает ли это, что мне нужно изменить решение для базы данных? и каково альтернативное решение?.

После этого:

Я попробовал два решения

  1. Открытие и закрытие sql-соединения для каждого вызова метода
  2. Увеличение размера пула соединений в строке соединения

Но оба дают мне задержку, если я увеличиваю количество пользователей, в то же время я наблюдаю за запросами в sql-порфилере, кажется, что каждый запрос не занимает более 20 миллисекунд.

Ответы [ 6 ]

4 голосов
/ 10 мая 2009

Вместо того, чтобы держать соединение с базой данных открытым для каждого сеанса, закрывайте его в конце каждого клиентского вызова, чтобы соединение возвращалось в пул соединений. (Соединение не будет полностью закрыто, когда оно находится в пуле, поэтому переподключение при повторном использовании происходит быстро.)

Таким образом, каждый сеанс будет использовать соединение только тогда, когда оно действительно необходимо. Вы должны увидеть резкое уменьшение количества соединений, необходимых для определенного количества сеансов, и ваше приложение должно иметь возможность обрабатывать намного больше сеансов.

Кроме того, поскольку сеансы не привязаны к соединениям, у вас не будет абсолютного ограничения на количество сеансов. Если нет доступа к соединению, когда сеанс хочет его установить, оно будет повторяться некоторое время, пока оно не будет доступно. Только если сервер действительно перегружен (т.е. запросы поступают быстрее, чем сервер может их обработать) в течение длительного времени, вы получите ошибки тайм-аута.

1 голос
/ 11 мая 2009

Нашел статью о пуле соединений SQL Server (ADO.NET), которая может оказаться полезной.

Пул соединений с сервером SQL (ADO.NET)

1 голос
/ 10 мая 2009

Я должен согласиться с более ранними постерами, вы должны посмотреть на закрытие связей. В то же время вы можете указать размер пула подключений в строке подключения: Максимальный размер пула

data source=RemoteHostName;initial catalog=myDb;password=sa;user id=sa;
Max pool size = 200; 
1 голос
/ 10 мая 2009

Агрессивно близкие соединения. Дважды проверьте упаковку всех компонентов ADO.NET, которые реализуют IDisposible, с помощью блоков или блоков try / finally, которые вызывают IDisposable и .Close для соединений, команд, устройств чтения данных и т. Д.

800 открытых соединений - это утечка соединения, если только у вас нет числа одновременных транзакций, подобных VISA или Google.

1 голос
/ 10 мая 2009

Одной из лучших бесплатных многопоточных книг в Интернете является книга Джо Албахари Threading на C #

Jon Skeet's Многопоточность в .NET: Введение и предложения также отлично

0 голосов
/ 23 мая 2009

После ряда экспериментов я увеличил число пользователей моей системы на 800% за счет набора изменений

  1. Максимальный размер пула соединений
  2. Создать один прокси-объект для клиента и отправлять его запросы последовательно, а не параллельно
  3. оптимизировать запросы sql и использовать некоторое кэширование на стороне службы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...