在使用hibernate和JPA的spring mvc应用程序中,我具有一个keyword类,该类使用户可以搜索基础数据库中的记录。JSP在蒲公英数据表中有一个搜索框,用户键入文本以减少keyword选项的数量,直到搜索结果包含足够短的列表为止keywords,用户可以从中选择要用于搜索的单词。
keyword
keywords
问题是,keywords基础数据表中有80,000 keywords,即使我在基础数据库表上为搜索中使用的字段添加了索引之后,我的应用程序仍需要20分钟才能将所有这些数据发送到JSP。有什么方法可以将其设置keywords为仅在搜索框中至少输入3个字符的文本时才发送给JSP吗?
这是我的controller方法:
controller
@RequestMapping(value = "/search", method = RequestMethod.GET) public String processFindForm( ConcWordKey wordkey, HttpServletRequest request, BindingResult result, Map<String, Object> model) { Collection<ConcWordKey> results = this.clinicService.findKeyWord(""); System.out.println("results.size() is: "+results.size()); model.put("selections", results); return "search"; }
这是JSP的相关部分:
<datatables:table id="keywords" data="${selections}" cdn="true" row="kw" theme="bootstrap2" cssClass="table table-striped" paginate="true" info="false" cssStyle="width: 150px;" align="left" dom="frtp"> <datatables:column title="Name" cssStyle="width: 150px;" display="html"> <spring:url value="/search?name={name}" var="searchUrl"> <spring:param name="name" value="${kw.name}"/> </spring:url> <a href="${fn:escapeXml(searchUrl)}"><c:out value="${kw.name}"/></a> </datatables:column> </datatables:table>
这是填充选择的JPA方法:
@SuppressWarnings("unchecked") public Collection<ConcWordKey> findKeyWord(String str) { Query query = this.em.createQuery("SELECT DISTINCT wk FROM ConcWordKey wk WHERE wk.name LIKE :wd"); query.setParameter("wd", str + "%"); Collection<ConcWordKey> results = query.getResultList(); return results; }
恐怕客户端性能不佳来自您用于加载数据的方法。我认为对于DOM源来说80000条记录实在太多了,尤其是在按键上触发搜索时。
在v0.10.0之前: 建议您切换到AJAX源(启用分页)。需要做更多的工作来设置内容,但它会对性能产生重大影响。请注意,JSP示例应用程序确实使用与您相同的技术(Spring,JPA)。随意看看。
但是,如果你真的想保持加载数据与DOM源,你可以简单地解除绑定的按键事件处理函数,如建议这个职位。要实现它,您将需要Dandelion-Datatables 的额外JavaScript功能。
从v0.10.0开始: 过滤功能已通过多种方式进行了改进:
当然,仍然建议使用AJAX源,但是以上功能将进一步改善UX。该版本发布后,我将使用指向新文档和示例应用程序的正确链接来更新此anwser。
希望这可以帮助!
(免责声明StackOverflow:我是《蒲公英》的作者)
编辑:蒲公英0.10.0发布。链接已添加