У меня есть клиент-серверное приложение, которое зависит от базы данных MS SQL для внутреннего хранения, серверное приложение - это служба WCF TCP, которая обрабатывает запросы клиентов, выбирая из базы данных набор информации.
Служба настроена как PerSession и поддерживает 500 сеансов.
На стороне клиента пользователь может открывать разные представления, у каждого представления есть объект моей службы (объект прокси), поэтому каждое представление является сеансом; В каждом представлении есть таймер потоков, который каждую секунду запрашивает данные с сервера, используя прокси-объект.
Приложение работает хорошо для небольшого числа пользователей с 8 представлениями, но когда я увеличиваю число, в SqlConnection возникает исключение тайм-аута. Открыто, поскольку в пуле соединений нет доступных соединений.
Существует сеанс / объект для каждого представления, поскольку служба WCF не является поточно-ориентированной; это зависит от однопоточного уровня доступа к базе данных, который использует SqlDataReaders и SqlAdapters.
Есть ли способ увеличить количество соединений с базой данных? кажется 800 это максимум !! С вашей точки зрения, как я могу увеличить количество пользователей?
Должен ли я изменить слой DB, сделать его многопоточным и сделать службу WCF одиночной?
Я думаю, что это узкое место в дизайне (можете ли вы порекомендовать статью для многопоточности в ADO.net)
P.S:
можно ли заменить базу данных в памяти или на более быстрое хранилище?
Согласно ответам:
Я изменил бэкэнд-сервис, чтобы закрыть соединение для вызова метода, но я сталкиваюсь с той же проблемой, так как количество пользователей увеличивает задержку (более одной секунды), означает ли это, что мне нужно изменить решение для базы данных? и каково альтернативное решение?.
После этого:
Я попробовал два решения
- Открытие и закрытие sql-соединения для каждого вызова метода
- Увеличение размера пула соединений в строке соединения
Но оба дают мне задержку, если я увеличиваю количество пользователей, в то же время я наблюдаю за запросами в sql-порфилере, кажется, что каждый запрос не занимает более 20 миллисекунд.