有REST服务,它在Hibernate和HS支持下搜索和更新数据。Lucene指数拥有超过150万份文档,而且还在不断增长。
问题:当服务将更新后的数据持久化到数据库(session.commit())时--同时HS执行数据索引,因为结果事务被延迟(2-5秒)--因此,对于数据更新请求,HTTP响应会被延迟。REST服务有很多方法,该服务的客户端希望在AJAX调用返回后(数据可用于“GET”,因此在服务器端以异步方式提交事务)不是一个选项(在POST之后客户端将无法获得数据)。
我正在使用hibernate.search.default.worker.execution=async,但是这个设置没有多大帮助(改进大约1秒)。原因是HS使用当前会话/线程为更新/创建的文档收集数据,然后异步索引到Lucene。
因此,我的问题是: 1.有没有一种方法可以通过HS异步执行主执行线程来执行数据计算?因此,在收集数据时,事务提交不会被冻结。2.我认为使用JMS与主/从不会有多大帮助,因为瓶颈不是索引本身,而是收集数据以进行索引?
发布于 2016-09-29 09:40:37
目前还没有这样的选择。
在类似的情况下,我设法优化了Hibernate的数据访问,因为2-5秒并不令人印象深刻,例如查看2级缓存,使不必要的关系懒惰(以及必要的关系渴望)。记住永远不要让缓存的关系急切,否则它就不会使用缓存。
如果您刚开始使用Hibernate,请知道它可能会被优化,以便在几毫秒内完成操作;不过,我很感激您可能已经是一位专家,只是拥有大量复杂的数据,当然,通过优化可以获得的数据是有限的,然后看看不同的模式是公平的。
我们可以考虑创建一个完全异步的索引过程,但它非常复杂:在您终止当前事务之后,我们将读取一个可能不一致的状态。解决方案是重新读取新事务中的整个对象图:提交事务后,在干净的会话中打开一个新的对象图,并重新加载所有必要的数据。这可能是一个有趣的选择,但您的服务器和数据库很有可能会受到这种模式所造成的所有额外工作的影响。
我把一些设计思想写成https://hibernate.atlassian.net/browse/HSEARCH-2364
https://stackoverflow.com/questions/39273444
复制相似问题