Прежде всего я нахожу, что загрузка 10 строк из общего количества 5000 за 1 минуту составляет ЧРЕЗВЫЧАЙНО медленно .Я думаю, что код сервера, а не jqGrid в узком месте в вашем случае.
Первая очень подозрительная строка вашего кода
List<Student> countStudents = Student.findAllStudents();
Вам необходимо получитьтолько число учеников, но кажется, что вы получаете все свойства всех учеников и затем используете countStudents.size()
в двух следующих строках.Максимум, что должно быть сделано, это что-то вроде
SELECT COUNT(*) FROM dbo.Students
Вместо этого это означает, что вы делаете SELECT * FROM dbo.Students
.
Может случиться так, что у вас возникнут серьезные проблемы в базе данных или при реализациифункция findAllStudentsOrderByColumn
если ваш код займет 1 минуту.Возможно, у вас есть несколько классов, которые представляют модель сущности или модель базы данных.Если у вас такая плохая производительность, вам нужно тщательно изучить код, который делает доступ к базе данных, или рассмотреть возможность использования более прямого доступа к базе данных, где вы можете указать запросы к базе данных напрямую.Я не Java или Spring разработчик, но я могу с уверенностью сказать, что если запрос из 10 строк из 5000 получает больше как 1 секунду , чем он уже слишком медленный.
Похоже,вам нужно вернуть несколько столбцов из одной таблицы включительно id
.Таким образом, вы можете получить данные с помощью SELECT
, например
SELECT TOP(10) id, firstName, lastName, dateOfBirth, gender, maritalStatus
FROM dbo.Students
ORDER BY id
, чтобы получить первую страницу данных, и что-то вроде следующего
WITH GetAll (id, firstName, lastName, dateOfBirth, gender, maritalStatus) AS (
SELECT id, firstName, lastName, dateOfBirth, gender, maritalStatus
FROM dbo.Students
ORDER BY id
), GetTop (id, firstName, lastName, dateOfBirth, gender, maritalStatus) AS (
SELECT TOP(20) * FROM GetAll -- skip 2 pages per 10 rows
), GetNext (id, firstName, lastName, dateOfBirth, gender, maritalStatus) AS (
SELECT TOP(10) a.* FROM GetAll AS a
LEFT OUTER JOIN GetTop AS t ON t.id = a.id
WHERE t.id IS NULL
)
SELECT * FROM GetNext
для всех следующих страниц.Я использовал синтаксис общего табличного выражения (CTE) , но вы можете использовать подзапросы, если ваша база данных не поддерживает его.
Поскольку вы разрешаете сортировать по каждому столбцу, вы должны создавать INDEXesна каждом столбце в таблице, чтобы улучшить производительность сортировки.(Я думаю, что таблица «Студенты» не будет изменяться с большим количеством изменений в секунду, поэтому индексы не уменьшат производительность таблицы).
Еще одна вещь, которую вы должны учитывать, - это изменить сериализациюв JSON.Использование String.format("\"%s\", someString)
опасно.Есть несколько символов, которые должны быть экранированы символом \
.Я имею в виду "
и \
.Вы должны сделать это, чтобы сделать код безопасным.Обычной практикой является использование некоторых стандартных классов, существующих на вашем языке, для сериализации (см., Например, здесь или здесь ).
Следующий совет - использовать jsonReader: {cell: ""}
и вернуть данные для строки в виде
["%s", "%s", "%s", "%s", "%s", "%s"]
вместо
{"id":"%s", "cell":["%s", "%s", "%s", "%s", "%s", "%s"]}
Вы не будете отправлять id
значение дважды и не будете отправлять строки "id"
"ячейка" и некоторые другие ненужные символы ('{', ':', ...).
На стороне клиента вы должны всегда использовать gridview: true
параметр jqGrid.С 10 строками данных вы не увидите серьезных различий, потому что jqGrid будет очень быстрым, но с большим количеством строк разница будет очень четкой.
Последнее предложение: вы должны использовать formatter: 'date'
и отправитьдата в формате ISO 8601 : например, 2012-03-20
.