Я разрабатываю игру с использованием TCP. Клиенты отправляют и слушают сервер, используя TCP. Когда сервер получает запрос, он обращается к базе данных (SQL Server Express / Entity Framework) и отправляет ответ клиенту.
Я пытаюсь создать MMORPG, поэтому мне нужно часто знать местоположения всех игроков, поэтому я использовал System.Timer , чтобы запросить у сервера местоположение игроков вокруг меня.
Проблема:
Если я настрою таймер на срабатывание каждые 500 мс метода, который запрашивает у сервера текущее местоположение игроков, тогда я могу открыть 2 экземпляра клиентского приложения, но оно будет тормозить. Если я настрою запускать каждые 50 мсек, то при открытии второго экземпляра SQL Server часто выдает это исключение:
«Соединение не было закрыто. Текущее состояние соединения открыто».
Я имею в виду, какого черта? Я знаю, что за короткий период времени запрашиваю МНОГОЕГО в базе данных, но как с этим справляются настоящие игры?
Вот один код, который выдает ошибку, когда кажется, что SQL Server перегружен (вторая строка метода):
private List<CharacterDTO> ListAround()
{
List<Character> characters = new List<Character>();
characters = ObjectSet.Character.AsNoTracking().Where(x => x.IsOnline).ToList();
return GetDto(characters);
}
2 ответа
Решил проблему изменением стратегии. Теперь я не обновляю позиции игроков в базе данных в реальном времени. Вместо этого я создал список (оперативная память) на сервере, поэтому я управляю только этим списком. Со временем я обновлю информацию в базе данных.
Ваша настоящая проблема в том, что ObjectSet
не является потокобезопасным. Вы должны создать новый контекст базы данных внутри ListAround
и удалить его, когда закончите с ним, а не повторно использовать один и тот же контекст снова и снова.
private List<CharacterDTO> ListAround()
{
List<Character> characters = new List<Character>();
using(var ObjectSet = new TheNameOfYourDataContextType())
{
characters = ObjectSet.Character.AsNoTracking().Where(x => x.IsOnline).ToList();
return GetDto(characters);
}
}
Похожие вопросы
Связанные вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.