2017-12-24 4 views
1

Ist Spring in der Lage, verschiedene Datenbankendpunkte für Failover und Query Routing zu verwenden - dh Lesevorgänge gehen zum Lesecluster, Schreibvorgänge gehen zum Master? Und geben Sie an, welcher Endpunkt pro Methode in einer Service KlasseSpring mehrere DB-Endpunkte

verwendet werden soll. Sagen wir zum Beispiel, wir haben den folgenden Service. Die save und delete können zum Schreiben an den Masterendpunkt gehen, während der Rest an die read cluster gehen kann.

@Service 
public class ProductService { 

    @Autowired 
    private ProductRepository productRepository; 
    @Autowired 
    private AttributeService attributeService; 

    // ------------------------------------------------------------- 

    private boolean nameAvailable(String name, Long id) { 
     if (id == null) { 
      return productRepository.findByNameEquals(name) == null; 
     } else { 
      return productRepository.findByNameEqualsAndIdIsNot(name, id) == null; 
     } 
    } 

    public synchronized void save(Product product, BindingResult result) { 
     // synchronized to avoid name duplication 
     if (!result.hasErrors()) { 
      if (!nameAvailable(product.getName(), product.getId())) { 
       result.addError(new FieldError("product", "name", "must be unique")); 
      } else { 
       productRepository.save(product); 
      } 
     } 
    } 

    public void delete(Long id) { 
     productRepository.delete(id); 
    } 

    // ------------------------------------------------------------- 

    public Page<Product> getProducts(PageRequest pageRequest) { 
     return productRepository.findAll(pageRequest); 
    } 

    public Product getProduct(Long id) throws ProductNotFoundException { 
     Product product = productRepository.findOne(id); 
     if (product == null) { 
      throw new ProductNotFoundException(); 
     } 
     return product; 
    } 

    public Page<Attribute> getAttributes(Product product, Pageable pageable) { 
     return attributeService.getAttributes(product, pageable); 
    } 
} 
+0

Ich glaube nicht, dass dies möglich ist (mindestens von Frühling lesen geroutet werden Seite) – pvpkiran

+0

Es gibt immer einen Weg. Ich werde es finden – Christian

+0

https://Stackoverflow.com/a/43326808/935122 – Christian

Antwort

0

diese stackoverflow.com/a/43326808/935122

Der beste Weg, MySQL Connector/J-Replikation bewusst Treiberkonfiguration Antwort Zitat zu verwenden ist. Die Connection String wird wie unten

jdbc:mysql:replication://[master host][:port],[slave host 1][:port][,[slave host 2][:port]]...[/[database]] 

Sobald Sie eine Transaktion markieren, als nur lesen, wird es automatisch nur Sklaven

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-master-slave-replication-connection.html