我目前正在开发一个项目,我们将Hibernate搜索升级到版本5.9.2(从3.4.2开始)。我们正在使用Lucene 5.5.5和Spring boot 1.5进行hibernate搜索。我们正在使用hibernate版本5.2.17。
在实体管理器配置JPA属性中设置了以下属性:
properties.put("hibernate.search.default.worker.thread_pool.size", "5");
然而,似乎这个属性没有任何影响。在调试过程中,我注意到在Hibernate Search" LazyExecutorHolder"中,执行器服务从null开始,并以线程池大小为1进行初始化。以下是来自hibernate search&#的代码snippit 39;代码:
package org.hibernate.search.backend.impl.lucene;
final class LazyExecutorHolder {
/**
* Lazily initialized; state change protected by executorStateWriteLock
*/
private ExecutorService asyncIndexingExecutor;
public void submitTask(LuceneBackendQueueTask task) {
executorStateReadLock.lock();
try {
final ExecutorService executor = asyncIndexingExecutor;
if ( executor != null ) {
executor.submit( task );
return; // !
}
}
finally {
executorStateReadLock.unlock();
}
//If not returned yet, means the executor wasn't available;
//Needs to be started within the exclusive lock.
executorStateWriteLock.lock();
try {
ExecutorService executor = asyncIndexingExecutor;
if ( executor == null ) {
executor = Executors.newFixedThreadPool( 1, threadNamePrefix, maxQueueLength );
this.asyncIndexingExecutor = executor;
}
executor.submit( task );
}
finally {
executorStateWriteLock.unlock();
}
}
...........
此属性是否已重命名/已删除?我们可以以任何其他方式配置lucene工作线程池大小吗?我在Hibernate Search文档中找不到删除的任何内容。升级Hibernate和Hibernate Search后,我们目前正在经历性能下降。
答案 0 :(得分:2)
删除thread_pool.size
我自己删除了这个属性,因为它很危险;它已被弃用了很长时间,最终被删除了。由于您很快就会从3升级到5,所以您也不会看到弃用警告,因为它们现在也被删除了。
当 thread_pool 属性高于1时,某些写入事件可能会重新排序,因此这是一个错误。
然而,我并不知道由此造成的显着写入性能下降:Lucene编写的后端代码自3.x以来已经发展了很多,现在单个线程能够将更大批量的更改推送到索引以更高的速率,可能通过单个线程使您的IO功能饱和,因此我通常期望性能更好。
新设计
所有这些变化的警告是,整体设计显然有点不同,因此应该审查您可能继承的任何调整选项。
特别是虽然我认为Lucene写作线程应该能够推动比其前任更高的费率,但是负责加载主要实体及其所有关系的前几个阶段已经统一了:有一个较少的阶段。
<强>建议强>
始终尝试使用Tuning Guide中描述的黑洞后端运行MassIndexer
,这样您就可以确保瓶颈实际上并非加载数据而不是将数据写入索引。
一旦您对数据的加载速度感到满意,通常可以通过使用其他可调参数(例如 merge_factor 和 ram_buffer_size ;如果我错了,你可以: