2016-11-09 4 views
2

У меня есть настройка, в которую данные вставляются в базу данных, а также индексируются в Solr. Эти два этапа завершаются транзакцией, управляемой весной, посредством аннотации @Transaction. То, что я заметил, что весна-данные Solr выдает обновление со следующими параметрами, когда сделка закрыта: Титулы {совершить = истинный & softCommit = ложь & waitSearcher = истина}Spring Data Solr @Transaction Commits

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

Скорости фиксаций в solr довольно высока, поэтому в идеале я бы хотел отправить данные в индекс solr и выполнить автокорреляцию solr через равные промежутки времени. У меня есть autoCommit (и autoSoftCommit), установленный в моем файле solrconfig.xml, но поскольку spring-data-solr отправляет эти параметры фиксации, он выполняет жесткую фиксацию каждый раз.

Я знаю, что я могу спуститься к API SolrTemplate и выдавать коммит вручную, я хотел бы сохранить вызов solr repository.save в рамках управляемой весной транзакции, если это возможно. Есть ли способ изменить параметры, которые отправляются в solr on commit?

ответ

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 bean для правого ядра solr:

@Configuration 
public class FooSolrConfig { 

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

Сноска: auto commit (на мой взгляд) концептуально несовместим с транзакцией. Автоматическая фиксация - это обещание от solr, что она попытается начать записывать ее на диск в течение определенного срока. Многие вещи могут помешать тому, что на самом деле происходит, - своевременная силовая или аппаратная сбой, ошибки между документом и схемой и т. Д. Но клиент не будет знать, что solr не выполнит свое обещание, и сделка увидит успех, когда это действительно провалилось.

Смежные вопросы