在使用hibernate和JPA的spring mvc app中,我有一个keyword
类,它允许用户搜索底层数据库中的记录。 JSP在蒲公英数据表中有一个搜索框,用户键入文本以减少keyword
个选项的数量,直到搜索结果包含一个足够短的keywords
列表,用户可以从中选择要用于搜索的单词。
问题是基础数据表中有80,000 keywords
,我的应用程序将所有keywords
发送到JSP需要20分钟,即使我放了一个搜索中使用的字段的基础数据库表的索引。是否有某种方法进行设置,以便keywords
仅在搜索框中输入至少3个字符的文本时才发送给JSP?
这是我的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;
}
答案 0 :(得分:1)
我担心糟糕的客户端性能来自您用于加载数据的方法。我认为80000记录对于DOM源来说太多了,尤其是在按键上搜索时。
在v0.10.0之前: 我建议你切换到AJAX source(启用分页)。设置工作需要做更多的工作,但它应该对性能产生重大影响。 请注意,JSP sample应用程序确实使用与您相同的技术(Spring,JPA)。随意看看。
但是,如果您真的想继续使用DOM源加载数据,则可以简单地取消绑定按键事件处理程序,如this post中所述。要实现它,您需要extra JavaScript feature蒲公英数据表。
从v0.10.0开始:,过滤功能已在多方面得到改进:
当然,仍然建议使用AJAX源,但上述功能将进一步改善用户体验。一旦此版本发布,我将使用指向新文档和示例应用程序的正确链接更新此anwser。
希望这有帮助!
(StackOverflow要求免责声明:我是蒲公英的作者)
编辑:蒲公英0.10.0发布。已添加链接答案 1 :(得分:0)
EhCache
可能不是您首先需要的。它提供了处理应用程序缓存的能力,这意味着在内存中保留最常用的对象,以便在需要时更快地(从内存而不是查询它们)访问它们。因此,如果你有8万个关键词,那听起来你有80 000多种搜索可能性,这意味着:
您可能需要的是一个基础索引系统,如Lucene
(如果您有多个实例,则为Solar
),这将帮助您加快查询速度。然后,无论之前是否被解雇,您的搜索都会更快。
当然,您可以使用带缓存系统的索引系统来获得更好的性能。我的观点是索引首先比缓存更重要。
其他一些想法:
编辑:回顾问题,自动完成功能会更好。例如:http://johnderinger.wordpress.com/2013/01/10/html-autocomplete-with-jpa-rest-and-jquery/