Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 加快搜索表单中的数据访问速度_Java_Spring_Jsp_Spring Mvc_Jpa - Fatal编程技术网

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

Java 加快搜索表单中的数据访问速度,java,spring,jsp,spring-mvc,jpa,Java,Spring,Jsp,Spring Mvc,Jpa,在使用hibernate和JPA的SpringMVC应用程序中,我有一个关键字类,它允许用户搜索底层数据库中的记录。JSP在蒲公英数据表中有一个搜索框,用户键入文本以减少关键字选项的数量,直到搜索结果包含足够短的关键字列表,用户可以从中选择用于搜索的单词 问题在于基础数据表中有80000个关键字,我的应用程序需要20分钟才能将所有这些关键字发送到JSP,即使我在基础数据库表上为搜索中使用的字段建立了索引。是否有某种方法可以设置它,使关键字仅在搜索框中输入至少3个字符时发送到JSP? 这是我的控制

在使用hibernate和JPA的SpringMVC应用程序中,我有一个
关键字
类,它允许用户搜索底层数据库中的记录。JSP在蒲公英数据表中有一个搜索框,用户键入文本以减少
关键字
选项的数量,直到搜索结果包含足够短的
关键字列表,用户可以从中选择用于搜索的单词

问题在于基础数据表中有80000个
关键字
,我的应用程序需要20分钟才能将所有这些
关键字
发送到JSP,即使我在基础数据库表上为搜索中使用的字段建立了索引。是否有某种方法可以设置它,使
关键字
仅在搜索框中输入至少3个字符时发送到JSP?

这是我的
控制器
方法:

@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";
}  
@RequestMapping(value=“/search”,method=RequestMethod.GET)
公共字符串处理FindForm(
ConcWordKey、HttpServletRequest请求、BindingResult结果、映射模型){
收集结果=this.clinicService.findKeyWord(“”);
System.out.println(“results.size()是:“+results.size()”);
模型。放置(“选择”,结果);
返回“搜索”;
}  
以下是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;
}
@SuppressWarnings(“未选中”)
公共集合findKeyWord(字符串str){
Query Query=this.em.createQuery(“从ConcWordKey wk中选择不同的wk,其中wk.name类似于:wd”);
query.setParameter(“wd”,str+“%”);
集合结果=query.getResultList();
返回结果;
}

EhCache
可能不是您首先需要的。它提供了处理应用程序缓存的能力,这意味着在内存中保留最常用的对象,以便在需要时更快地访问它们(从内存而不是查询它们)。因此,如果你有80000个关键词,听起来你有80000多个搜索可能性,这意味着:

  • 将它们全部保存在缓存中需要大量内存
  • 您必须搜索所有文件一次,才能将其放入缓存中
不过,您可能需要一个底层索引系统,比如
Lucene
(或者
Solar
,如果您有多个实例),这将帮助您加快查询速度。然后,你的搜索速度会更快,无论他们之前是否被激发过

当然,您可以将索引系统与缓存系统结合使用,以获得更好的性能。我的观点是,索引一开始比缓存更重要

其他一些想法:

  • 确保启用数据库缓存(lvl1缓存),以便查询速度更快
  • 在关键字列上添加一个数据库索引(还可以加快很多select查询)
祝你好运


编辑:回顾问题,自动完成功能会更好。例如:

我担心客户端性能差是由于您用于加载数据的方法造成的。我认为80000条记录对于一个DOM源来说太多了,尤其是在使用keypress进行搜索的情况下

在v0.10.0之前: 我建议您切换到(启用分页的)。设置需要做更多的工作,但这会对性能产生重大影响。 请注意,该应用程序确实使用了与您相同的技术(Spring、JPA)。随便看看

但是,如果您真的想继续使用DOM源加载数据,可以简单地解除keypress事件处理程序的绑定,如中所建议的。要实现它,您需要使用Dandelion数据表

从v0.10.0开始:过滤功能在多个方面得到了改进:

  • 在启动搜索之前,始终应用a(默认为500毫秒,可配置)
  • 还可以配置
  • 或者你也可以用它来代替
当然,仍然建议使用AJAX源代码,但上述特性将进一步改进UX。一旦这个版本发布,我会用新文档和示例应用的正确链接更新这个anwser

希望这有帮助

(StackOverflow要求的免责声明:我是《蒲公英》的作者)


编辑:蒲公英0.10.0发布。添加的链接

介绍分页和限制每页的数据。@LeosLiterak谢谢。“但你能告诉我在代码中会是什么样子吗?”CodeMed是一个暂时可以建议的解决方法,直到我通过dandelion datatable API。在控制器中,如果大小小于3,不要总是调用DAO方法。当输入的关键字长度至少为3时,调用数据库以获取结果。同时,我搜索altimate soutionthis@Gautam非常感谢你。但我甚至不知道如何编写3个以上字符的检查;在inputString大小小于3之前不要执行此行谢谢您花时间回复。我在数据库中添加了一个索引,它至少现在给出了一些初始结果,向用户显示它在JSP冻结时正在做一些事情。但还是太慢了。你能用代码给我一个具体的解决方案吗?我重新阅读了你的问题,我建议你使用另一种方法。据我所知,你需要过滤关键字,这样用户就可以从一个简单的列表中进行选择。给出你拥有的关键字的数量,例如,最好使用自动完成功能,这意味着只加载与用户输入匹配的关键字。因此,您将加载没有标记的页面(非常快),并在用户输入时异步加载它们。为了获得更好的性能,仅当他输入至少3或4个字符时才查询数据库。你觉得怎么样?是的,t