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