加快搜索表单中的数据访问速度

时间:2014-05-14 18:54:59

标签: java spring jsp spring-mvc jpa

在使用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;
}

2 个答案:

答案 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),这将帮助您加快查询速度。然后,无论之前是否被解雇,您的搜索都会更快。

当然,您可以使用带缓存系统的索引系统来获得更好的性能。我的观点是索引首先比缓存更重要。

其他一些想法:

  • 请务必启用数据库缓存(lvl1缓存),以便您的查询更快
  • 在关键字列上添加数据库索引(同时加快选择查询的速度)
祝你好运!

编辑:回顾问题,自动完成功能会更好。例如:http://johnderinger.wordpress.com/2013/01/10/html-autocomplete-with-jpa-rest-and-jquery/