如何配置hibernate search 5.9工作线程池大小

时间:2018-06-13 14:23:17

标签: java spring hibernate lucene hibernate-search

我目前正在开发一个项目,我们将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后,我们目前正在经历性能下降。

1 个答案:

答案 0 :(得分:2)

删除thread_pool.size

我自己删除了这个属性,因为它很危险;它已被弃用了很长时间,最终被删除了。由于您很快就会从3升级到5,所以您也不会看到弃用警告,因为它们现在也被删除了。

thread_pool 属性高于1时,某些写入事件可能会重新排序,因此这是一个错误。

然而,我并不知道由此造成的显着写入性能下降:Lucene编写的后端代码自3.x以来已经发展了很多,现在单个线程能够将更大批量的更改推送到索引以更高的速率,可能通过单个线程使您的IO功能饱和,因此我通常期望性能更好。

新设计

所有这些变化的警告是,整体设计显然有点不同,因此应该审查您可能继承的任何调整选项。

特别是虽然我认为Lucene写作线程应该能够推动比其前任更高的费率,但是负责加载主要实体及其所有关系的前几个阶段已经统一了:有一个较少的阶段。

<强>建议

始终尝试使用Tuning Guide中描述的黑洞后端运行MassIndexer,这样您就可以确保瓶颈实际上并非加载数据而不是将数据写入索引。

一旦您对数据的加载速度感到满意,通常可以通过使用其他可调参数(例如 merge_factor ram_buffer_size ;如果我错了,你可以:

  • 启用分片,这将线性扩大索引写入速度(只要分片不会共享相同的存储瓶颈 - 但线程也不会帮助)
  • 通过一些详细的分析数据联系Hibernate Search团队,例如:理想情况下,您可以创建一个新的JIRA并附加来自飞行记录器的录音。