2016-04-28 4 views
1

Ich versuche, in zwei verschiedenen Eimern in couchbase mit Spring Boot zu verbinden. Aber in einer einzelnen Spring-Boot-Anwendung nimmt die Datenbankkonfiguration nur einen einzigen Bucket-Namen an.Ist es möglich, mit zwei verschiedenen Eimern von couchbase im Springboot zu verbinden

Ist es möglich, mit mehr als einem couchbase Bucket im Spring-Boot zu verbinden?

+0

Nicht sicher, was Sie meinen. Sie sollten immer in der Lage sein 'Cluster.openBucket (" name "," password ") zu verwenden.' –

Antwort

3

So scheint es, Ihnen aus einer Feder Boot-Anwendung Spring Data Couchbase verwenden möchten, und haben (mindestens) zwei verschiedene Repositories von zwei verschiedenen Bucket gesichert?

Sie müssen Ihre Spring Data-Konfiguration programmgesteuert anpassen (im Gegensatz zu Federbooten, die alle schweren Arbeiten ausführen), aber das ist möglich.

  • Frühling Stiefel schafft eine CouchbaseConfigurer, durch die es standardmäßig Cluster und Bucket schafft (wie abgestimmt in den Eigenschaften-Datei).
  • Wenn Sie einen CouchbaseRepository in Ihrem Klassenpfad haben, wird auch versucht, Spring Data zu konfigurieren, indem eine SpringBootCouchbaseDataConfiguration-Klasse instanziiert wird.
  • Sie können, dass durch die SpringBootCouchbaseDataConfiguration oben in Ihrem Projekt erstreckt, als @Configuration
Markierung

Sobald Sie die Spring Data Konfiguration programmatisch zu gestalten sind bereit, was Sie brauchen, ist ein zweiten Bucket Bean zu erstellen, eine zweite CouchbaseTemplate, die diesen Bucket verwendet, und dann Spring Data Couchbase anweisen, welche Vorlage mit welcher Repository verwendet werden soll.

Zu diesem Zweck gibt es eine configureRepositoryOperationsMapping(...) Methode. Sie können die Parameter dieser Methode als Builder verwenden:

  • Link eine bestimmte Repository Schnittstelle zu einem CouchbaseTemplate: map
  • sagen, dass jede Repo mit einem bestimmten Entitätstyp eine gegebene Vorlage verwenden sollte: mapEntity
  • sogar die zu verwendende Standardvorlage neu definieren (zunächst die von Spring Boot erstellte): setDefault.

Dieser zweite Teil wird in der Spring Data Couchbase documentation erläutert.

+0

Danke, ich kann Verbindung zu beiden Eimern herstellen. Ich habe einen Zweifel in diesem Fall. Werden beide Repositories unterschiedliche Verbindungen haben oder teilen sie sich dieselbe Verbindung? – piyush

+1

Solange sie denselben Cluster verwenden, teilen sie so viele Ressourcen wie möglich, einschließlich Verbindungen –

+0

Gibt es eine Möglichkeit, dass wir unterschiedliche Verbindungen für beide Repositories haben können. Eines der Repositories dient nur zum Lesen und das andere zum Lesen/Schreiben. Wir sehen ein Leistungsproblem, das aufgrund der gleichen Verbindung nicht sicher ist. – piyush

1

Wahrscheinlich, was Sie versuchen zu sagen ist, dass Spring Boot bietet vordefinierte Eigenschaften, die Sie ändern können, wie zum Beispiel: couchbase.cluster.bucket, die einzelnen Wert und Sie möchten eine Verbindung zu zwei oder mehr Buckets.

Für den Fall, dass Sie keine bessere Lösung finden, kann ich Sie auf einen etwas anderen Ansatz hinweisen, und das ist die Einrichtung Ihres eigenen couchbase Verbindungs-Managers, den Sie überall injizieren können.

Hier ist das Beispiel einer solchen @Service, die Sie mit zwei Verbindungen zu verschiedenen Buckets bereitstellen wird.

Sie können an Ihre Bedürfnisse anpassen, es ist sehr klein.

import java.util.ArrayList; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.annotation.PreDestroy; 

import org.apache.log4j.Logger; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.stereotype.Service; 

import com.couchbase.client.java.Bucket; 
import com.couchbase.client.java.Cluster; 
import com.couchbase.client.java.CouchbaseCluster; 
import com.couchbase.client.java.env.CouchbaseEnvironment; 
import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; 

@Service 
public class CouchbaseConnectionManager { 
    private static final int TIMEOUT = 100000; 

    @Value("#{configProp['couchbase.nodes']}") 
    private List<String> nodes = new ArrayList<String>(); 

    @Value("#{configProp['couchbase.binary.bucketname']}") 
    private String binaryBucketName; 

    @Value("#{configProp['couchbase.nonbinary.bucketname']}") 
    private String nonbinaryBucketName; 

    @Value("#{configProp['couchbase.password']}") 
    private String password; 

    private Bucket binaryBucket; 

    private Bucket nonbinaryBucket; 

    private Cluster cluster; 

    private static final Logger log = Logger.getLogger(CouchbaseConnectionManager.class); 

    @PostConstruct 
    public void createSession() { 

     if (nodes != null && nodes.size() != 0) { 
      try { 
       CouchbaseEnvironment env = DefaultCouchbaseEnvironment.builder().connectTimeout(TIMEOUT).build(); 

       cluster = CouchbaseCluster.create(env, nodes); 

       binaryBucket = cluster.openBucket(binaryBucketName, password); 
       nonbinaryBucket = cluster.openBucket(nonbinaryBucketName, password); 
       log.info(GOT_A_CONNECTION_TO_COUCHBASE_BUCKETS + binaryBucket + " " + nonbinaryBucket); 
      } catch (Exception e) { 
       log.warn(UNABLE_TO_GET_CONNECTION_TO_COUCHBASE_BUCKETS); 
      } 
     } else { 
      log.warn(COUCH_NOT_CONFIGURED); 
     } 
    } 

    @PreDestroy 
    public void preDestroy() { 
     if (cluster != null) { 
      cluster.disconnect(); 
      log.info(SUCCESSFULLY_DISCONNECTED_FROM_COUCHBASE); 
     } 
    } 

    public Bucket getBinaryBucket() { 
     return binaryBucket; 
    } 

    public Bucket getNonbinaryBucket() { 
     return nonbinaryBucket; 
    } 

    private static final String SUCCESSFULLY_DISCONNECTED_FROM_COUCHBASE = "Successfully disconnected from couchbase"; 
    private static final String GOT_A_CONNECTION_TO_COUCHBASE_BUCKETS = "Got a connection to couchbase buckets: "; 
    private static final String COUCH_NOT_CONFIGURED = "COUCH not configured!!"; 
    private static final String UNABLE_TO_GET_CONNECTION_TO_COUCHBASE_BUCKETS = "Unable to get connection to couchbase buckets"; 
} 
+0

Ich benutze Spring boot CouchbaseRepository, um die Implementierung aller Quarkoperationen in diesem Fall zu erhalten. Ich denke nicht, dass ich in der Lage sein werde, zu injizieren, oder Spring Boot wird in der Lage sein, mir Quarkoperationen Implementierung für beide Eimer zu geben. – piyush

+0

Ich denke an verschiedene Config-Klasse für jeden Bucket und für jede Datenbank-Konfiguration kann ich bieten @EnableCouchbaseRepositories (basePackages = { "com.gp.api.common.repo.couchbase"}), so dass es die richtige Repo identifizieren wird und instanziieren Sie den korrekten Repo für jeden Bucket mit Quarkoperationen. – piyush

Verwandte Themen