#java #jquery #mysql #ajax #spring-mvc
#java #jquery #mysql #ajax #spring-mvc
Вопрос:
Я использую Spring MVC, и мне нужно получить больше, чем 400k datas
по моей таблице, где я также использую JOIN в запросе mysql.
На самом деле у меня есть контроллер, который возвращает список. Я вызываю контроллер с помощью AJAX.
Проблема с моим решением заключается в том, что я не могу получить данные списка за считанные секунды, для загрузки на страницу JSP требуется более 5 минут.
На странице Jquery..
$(document).ready(function ajaxPost() {
$.ajax({
type: "GET",
data: page,
url: "allListAjax",
success: function(list) {
//here i get responce list and page which takes 5 minutes
}//success
}//ajax
}//ready
В контроллере..
@RequestMapping(value="/allListAjax")
public @ResponseBody IVRRouteReportWrapper dashoardAjax(Model model, @RequestParam(required = false) Integer page) {
IVRRouteReportWrapper wrappObj= new IVRRouteReportWrapper();
List<IVRRouteReport> list = ivrRouteServiceInterface.getAllIVRRouteReport(page);
wrappObj.setIVRouteReportList(list);
wrappObj.setPage(page);
return wrappObj;
}
здесь IVRRouteReportWrapper
представлена модель предметной области, которая содержит установщики и получатели списка и страницы.
В реализации сервиса…
public List<IVRRouteReport> getAllIVRRouteReport(Integer page) {
return ivrRouteDAOInterface.getAllIVRRouteReport(page);
}
В реализации Dao…
public List<IVRRouteReport> getAllIVRRouteReport(Integer page) {
if(page==null) {
page = 0;
}else {
page = page*200;
}
String strqry= "SELECT c.caller_id_number as caller_id_number, c.destination_number as destination_number,"
" c.created_time as created_time, vbDtmf.digit as dtmf FROM VoiceBroadcastDTMF vbDtmf "
"LEFT JOIN cdr c ON vbDtmf.uuid=c.orig_id ORDER BY c.created_time DESC";
Query query = getSession().createSQLQuery(strqry)
.addScalar("caller_id_number", new StringType())
.addScalar("destination_number", new StringType())
.addScalar("created_time", new StringType())
.addScalar("dtmf", new StringType())
.setResultTransformer(Transformers.aliasToBean(IVRRouteReport.class))
.setFirstResult(page)
.setMaxResults(200);
List<IVRRouteReport> ivrRouteReportList =(List<IVRRouteReport>) query.getResultList();
getSession().flush();
return ivrRouteReportList;
}
Есть ли какой-нибудь способ быстро вернуть этот список на страницу jsp? Заранее спасибо.
Ответ №1:
Проиндексируйте столбец «created_time», а также опустите необязательные поля, указав в запросе только обязательные поля, как показано ниже
String strqry= "SELECT c.caller_id_number as caller_id_number, c.destination_number as destination_number,"
" c.created_time as created_time, vbDtmf.digit as dtmf FROM VoiceBroadcastDTMF vbDtmf "
"LEFT JOIN (SELECT caller_id_number , destination_number , created_time FROM cdr) as c ON vbDtmf.uuid=c.orig_id ORDER BY c.created_time DESC";
Ответ №2:
Перейдите к разбиению на страницы.
Комментарии:
1. Спасибо за ответ, дорогой, я уже установил разбивку на страницы, по 200 данных на пакет, но это занимает от 4 до 5 минут..
2. попробуйте использовать async: false в запросе ajax.
3. на самом деле я никогда этим не пользуюсь. можете ли вы дать некоторый намек на asyn: false и как это работает.. Еще раз спасибо.
4. смотрите это aspsnippets.com/Articles /…
5. когда мы переходим к async: false, это блокирует браузер (прокрутку), и я ничего не могу сделать, пока вызов не будет завершен. и это занимает столько же времени, сколько 4-5 минут