gpt4 book ai didi

Spring Data Solr @Transaction 提交

转载 作者:行者123 更新时间:2023-12-02 16:17:28 25 4
gpt4 key购买 nike

我目前有一个设置,将数据插入数据库,并索引到 Solr 中。这两个步骤通过 @Transaction 注解包装在 spring 管理的事务中。我注意到,每当事务关闭时, spring-data-solr 都会发出以下参数的更新: params{commit=true&softCommit=false&waitSearcher=true}

@Transactional
public void save(Object toSave){
dbRepository.save(toSave);
solrRepository.save(toSave);
}

提交到 solr 的比率相当高,因此理想情况下我希望将数据发送到 solr 索引,并定期让 solr 自动提交。我在 solrconfig.xml 中设置了 autoCommit (和 autoSoftCommit),但由于 spring-data-solr 正在发送这些提交参数,因此它每次都会进行硬提交。

我知道我可以下拉到 SolrTemplate API 并手动提交问题,如果可能的话,我想将 solr repository.save 调用保留在 spring 管理的事务中。有没有办法修改提交时发送到 solr 的参数?

最佳答案

在 org.springframework.data.solr.repository.support.SimpleSolrRepository 中放置 IDE 调试断点后:

private void commitIfTransactionSynchronisationIsInactive() {
if (!TransactionSynchronizationManager.isSynchronizationActive()) {
this.solrOperations.commit(solrCollectionName);
}
}

我发现将我的代码包装为@Transactional(以及实际使框架能够作为事务开始/结束代码的其他细节)并不能达到我们对“Spring Data for Apache Solr”的期望。堆栈跟踪显示了我们代码的事务范围的代理和事务拦截器类,但它也显示了框架使用自己的另一个代理和事务拦截器启动自己的嵌套事务。当框架退出我的代码调用的 CrudRepository.save() 方法时,提交到 Solr 的操作由框架的嵌套事务完成。它发生在我们的外部事务退出之前。因此,尝试在最后一次提交而不是每次保存一次提交来批量处理许多保存是徒劳的。看来,对于我的代码中的这个区域,我必须使用 SolrJ 将我的实体保存(更新)到 Solr,然后让“我的”事务退出后进行提交。

关于Spring Data Solr @Transaction 提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40513830/

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