Я реализовал ServiceStack (v4.0.36) с подключением ORMLite к моей базе данных SQL Server 2014. На моем веб-сайте есть форма поиска, которая передает любые заполненные поля маршруту «/search» в качестве параметров строки запроса. Мой запрос DTO выглядит так:
[Route("/search", "GET")]
public class SearchRequest
{
public string FirstName { get; set; }
public string LastName { get; set; }
...
}
(всего 8 параметров). Затем у меня есть служба, которая вызывает хранимую процедуру в SQL, передавая все такие параметры, как:
public class MyServices : Service
{
public object Get(SearchRequest request)
{
using (var db = AppHostBase.Instance.Container.TryResolve<OrmLiteConnectionFactory>().OpenDbConnection())
{
List<SearchResponse> searchResults = db.SqlList<SearchResponse>("EXEC sp_web_ResultListByNameOrAddress @firstName, @lastName, ...",
new
{
firstName = request.FirstName,
lastName = request.LastName,
...
});
return searchResults;
}
}
}
Проблема в том, что если я выполняю поиск на веб-сайте, для получения результатов требуется до 30 секунд (или время истекает, и соединение обрывается). Если я выполняю ту же хранимую процедуру в SQL, я получаю результаты мгновенно (индексируются поля поиска и комбинации).
Я заметил некоторый прирост производительности после изменения моего web.config
<compilation targetFramework="4.5" debug="false"/>
... но я все еще не понимаю, где происходит узкое место. Любая помощь будет принята с благодарностью!
на на на на на на на на ... Бэтмен! ?
ОБНОВЛЕНИЕ. К вашему сведению, я подключаюсь к этой службе через отдельное веб-приложение AngularJS, но также получаю проблемы с медлительностью или тайм-аутом при тестировании службы через клиент REST, такой как Postman. Спасибо.
ОБНОВЛЕНИЕ 2: я включил мини-профилировщик... задержка на этапе «Выполнение службы». Вот пример поискового запроса:
Я собираюсь включить профилирование SQL в соединении ORMLite и опубликовать все обновления.
ОБНОВЛЕНИЕ 3: Не очень полезно (я думаю)... SQL Profiler просто показывает сохраненный процесс, который был выполнен:
ОБНОВЛЕНИЕ 4: Интересно. Таким образом, у меня есть профилировщик SQL Server SSMS, работающий вместе с моим запросом с включенным мини-профилировщиком, и я также устанавливаю точку останова в реализации службы на строке, которая запускает хранимую процедуру.
Когда я загружаю страницу, сразу же срабатывает точка останова. Когда я продолжаю, я вижу сообщение «Аудит входа в систему» в SQL Server Profiler. Затем ничего в течение нескольких минут, затем сообщение «RPC: Completed» с сохраненным процессом и переданными аргументами.
Таким образом, запрос не попадает в SQL до самого конца, где он возвращается почти сразу (как и следовало ожидать). Почему существует большая задержка между отправкой запроса ServiceStack и его фактическим выполнением на SQL Server? Все локально, поэтому я не вижу проблемы с сетью. Кто-нибудь?