2016-11-09 90 views
2

我目前有一個設置,其中數據插入到數據庫中,並且索引到Solr中。這兩個步驟通過@Transaction註釋封裝在Spring管理的事務中。我已經注意到的是,彈簧數據的Solr發出一個更新每當交易被關閉下列參數:PARAMS {提交=真正& softCommit =假& waitSearcher =真}Spring Data Solr @Transaction Commits

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

的提交速度到solr是相當高的,所以理想情況下,我想發送數據到solr索引,並定期solr自動提交。我在我的solrconfig.xml中設置了autoCommit(和autoSoftCommit),但由於spring-data-solr正在發送這些提交參數,因此每次都會進行艱難的提交。

我知道我可以下載到SolrTemplate API並手動發出提交,如果可能的話,我想在spring-managed事務中保留solr repository.save調用。有沒有辦法修改發送給solr的參數?

回答

0

我做了類似的事情的方式是創建一個自定義存儲庫實現的保存方法。

接口庫:

public interface FooRepository extends SolrCrudRepository<Foo, String>, FooRepositoryCustom { 
} 

界面自定義覆蓋:

public interface FooRepositoryCustom { 
    public Foo save(Foo entity); 
    public Iterable<Foo> save(Iterable<Foo> entities); 
} 

定製覆蓋的執行情況:

public class FooRepositoryImpl { 

    private SolrOperations solrOperations; 

    public SolrSampleRepositoryImpl(SolrOperations fooSolrOperations) { 
     this.solrOperations = fooSolrOperations; 
    } 

    @Override 
    public Foo save(Foo entity) { 
     Assert.notNull(entity, "Cannot save 'null' entity."); 
     registerTransactionSynchronisationIfSynchronisationActive(); 
     this.solrOperations.saveBean(entity, 1000); 
     commitIfTransactionSynchronisationIsInactive(); 
     return entity; 
    } 

    @Override 
    public Iterable<Foo> save(Iterable<Foo> entities) { 
     Assert.notNull(entities, "Cannot insert 'null' as a List."); 

     if (!(entities instanceof Collection<?>)) { 
      throw new InvalidDataAccessApiUsageException("Entities have to be inside a collection"); 
     } 

     registerTransactionSynchronisationIfSynchronisationActive(); 
     this.solrOperations.saveBeans((Collection<? extends T>) entities, 1000); 
     commitIfTransactionSynchronisationIsInactive(); 
     return entities; 
    } 

    private void registerTransactionSynchronisationIfSynchronisationActive() { 
     if (TransactionSynchronizationManager.isSynchronizationActive()) { 
      registerTransactionSynchronisationAdapter(); 
     } 
    } 

    private void registerTransactionSynchronisationAdapter() { 
     TransactionSynchronizationManager.registerSynchronization(SolrTransactionSynchronizationAdapterBuilder 
       .forOperations(this.solrOperations).withDefaultBehaviour()); 
    } 

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

,你還需要提供一個SolrOperations正確的solr核心豆:

@Configuration 
public class FooSolrConfig { 

    @Bean 
    public SolrOperations getFooSolrOperations(SolrClient solrClient) { 
     return new SolrTemplate(solrClient, "foo"); 
    } 
} 

腳註:自動提交(在我的腦海中)概念上與交易不相容。自動提交是solr的承諾,它會嘗試在特定的時間限制內開始將其寫入磁盤。然而,很多事情可能會阻止實際發生的事情 - 及時的電源或硬件故障,文檔和模式之間的錯誤等等。但客戶不知道Solr未能遵守諾言,並且交易將在它實際上失敗了。