2016-11-09 15 views
2

私は現在、データがデータベースに挿入されるだけでなく、Solrにインデックスされた設定を持っています。これらの2つのステップは@Transactionアノテーションを介してバネ管理のトランザクションにラップされます。私が気づいたことは、トランザクションがクローズされたときに、スプリング・データ・Solrには、次のパラメータを使用してアップデートを発行している:のparams {=真&で、SoftCommit = falseを& waitSearcher =真をコミット}Spring Data Solr @トランザクションコミット

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

コミットの割合solrにはかなり高いので、理想的にはsolrインデックスにデータを送信し、一定間隔でsolr自動コミットが必要です。 autoCommit(とautoSoftCommit)をsolrconfig.xmlに設定しましたが、spring-data-solrがコミットパラメータを送信しているので、毎回強制コミットします。

私はSolrTemplate APIにドロップダウンして手動でコミットを行うことができることを知っています。可能であれば、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を提供する必要があります右ソルコアのための豆:

@Configuration 
public class FooSolrConfig { 

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

脚注:自動コミットは、概念的にはトランザクションとは互換性がありません。自動コミットは、solrが一定の時間内にディスクに書き込もうと試みるという約束です。多くのことが実際には起こらないかもしれませんが、タイムリーな電源やハードウェアの障害、ドキュメントとスキーマ間のエラーなどです。しかし、クライアントはsolrが約束を守らなかったことを知りません。それは実際には失敗しました。

関連する問題