在几秒钟内从 Spring MVC 中的表中获取 400K 数据

Posted

技术标签:

【中文标题】在几秒钟内从 Spring MVC 中的表中获取 400K 数据【英文标题】:get 400K data from tables in Spring MVC within some sec 【发布时间】:2019-07-28 21:19:02 【问题描述】:

我正在使用 Spring MVC,我需要在我的表中获得更多 400k datas,我也在 mysql 查询中使用 JOIN。

我实际上拥有的是一个控制器,它返回包含一个列表。我使用 AJAX 调用控制器。

我的解决方案的问题是我无法在几秒钟内获取 List 的数据,在 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 是一个 Domain 模型,其中包含 List 和 page 的 setter 和 getter。

在服务实现中...

 public List<IVRRouteReport> getAllIVRRouteReport(Integer page) 
      return ivrRouteDAOInterface.getAllIVRRouteReport(page);
    

在道实现中...

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】:

进行分页。

参考spring-mvc-pagination

【讨论】:

感谢回复亲爱的,我已经设置了分页,每批200个数据,但需要时间4到5分钟.. 在 ajax 请求中尝试 async: false。 其实我从来没用过。你能给出一些关于 asyn: false 的提示以及它是如何工作的......再次感谢。 看到这个aspsnippets.com/Articles/… 当我们使用 async: false 时,它​​会阻止浏览器(滚动),在调用完成之前我什么也做不了。它需要相同的时间,例如 4 到 5 分钟

以上是关于在几秒钟内从 Spring MVC 中的表中获取 400K 数据的主要内容,如果未能解决你的问题,请参考以下文章

紧急求助:如何在5秒钟内从2000万条记录的数据库中查询获取20条记录?

如何使用 FusedLocationProviderClient 获取准确的位置(纬度和经度)

在过去 X 小时内从 HBase 表中获取所有数据的最佳方法是啥?

将修改后的表发送到 ASP.NET MVC 中的控制器?

微软发布Power BI Premium,加速现代商业智能普及

更新联系人姓名会保留最后一个联系人一秒钟