gpt4 book ai didi

java - hibernate 搜索 : prevent from high memory usage during batch insert

转载 作者:行者123 更新时间:2023-11-30 03:54:37 25 4
gpt4 key购买 nike

在使用自动索引执行批量插入时,Hibernate Search 会创建数百万个 org.apache.lucene.document.Field 实例,这些实例都保留在内存中,直到事务完成。

由于我无法使用任何 HS 选项来修复该问题,并且我不想刷新未提交的事务,因此我想在批处理之前暂停自动索引,然后手动更新索引。为此,我设置了以下选项:

 hibernateProperties.put("hibernate.search.default.indexBase", "path/to/index");
hibernateProperties.put("hibernate.search.model_mapping", searchMappingFactory.createSearchMapping());
hibernateProperties.put("hibernate.search.autoregister_listeners", false);

我使用以下方法编写自定义 FullTextIndexEventListener:

@Override
public void onPostInsert(PostInsertEvent event) {
if (!isPaused) {
super.onPostDelete(event);
}
}

我使用我的自定义集成器集成它:

@Component
public class HibernateEventIntegrator {

@Autowired
private SessionFactoryImpl sessionFactory;
@Autowired
private SearchIndexEventListener searchIndexEventListener;

@PostConstruct
public void integrate() {
EventListenerRegistry listenerRegistry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class);
listenerRegistry.appendListeners(EventType.POST_INSERT, searchIndexEventListener);
//... and so for all events like in HibernateSearchIntegrator
searchIndexEventListener.initialize(sessionFactory.getProperties());
}
}

但是,在这种情况下,不会读取映射,就好像没有对实体进行索引一样,它们只能由 native HS 集成器看到。

我还尝试使用带有跳过操作的拦截器,但这似乎不是一个好的解决方案。

是否有任何解决方案可以以编程方式暂停自动索引而不完全切换到手动索引?

最佳答案

Hibernate Search 不提供这样的功能 atm。另请参阅https://hibernate.atlassian.net/browse/HSEARCH-168https://hibernate.atlassian.net/browse/HSEARCH-387

一种解决方法是使用两个单独的 SessionFactory,一个启用事件处理,另一个禁用事件处理。然后,您将根据用例从正确的工厂打开 session 。

关于java - hibernate 搜索 : prevent from high memory usage during batch insert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23548292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com