2016-04-28 56 views
1

我試圖使用彈簧啓動連接到兩個不同的桶在couchbase中。但是,在單個spring引導應用程序中,數據庫配置只能使用一個存儲桶名稱。是否可以在彈簧啓動時連接到兩個不同桶的couchbase

是否可以在彈簧啓動時連接到多個couchbase桶?

+0

不確定你的意思。你應該總是可以做'Cluster.openBucket(「name」,「password」)' –

回答

3

因此,看來你想在春天啓動應用程序內使用Spring數據Couchbase,並有(至少)兩個不同的版本庫由兩個不同的Bucket支持?

您必須以編程方式自定義您的Spring Data配置(而不是讓Spring Boot完成所有繁重的工作),但這是可能的。

  • 彈簧引導創建CouchbaseConfigurer,通過它創建默認ClusterBucket(如在特性調諧的文件)。
  • 如果您的類路徑中有CouchbaseRepository,它還會嘗試通過實例化SpringBootCouchbaseDataConfiguration類來配置Spring數據。
  • 您可以自定義在您的項目延長上述SpringBootCouchbaseDataConfiguration,將其標記爲@Configuration

一旦你準備編程自定義春數據配置,你需要的是創建第二個Bucket豆,第二個CouchbaseTemplate使用該存儲桶,然後指示Spring Data Couchbase使用哪個模板與哪個模板使用Repository

爲此,有一個configureRepositoryOperationsMapping(...)方法。您可以使用此方法的參數作爲一個建設者到:

  • 鏈接特定Repository接口與CouchbaseTemplatemap
  • 說,與特定的實體類型的任何回購應該使用指定的模板:mapEntity
  • 甚至重新定義要使用的默認模板(最初由Spring Boot創建的模板):setDefault

第二部分在Spring Data Couchbase documentation中解釋。

+0

謝謝,我能夠連接到兩個桶。在這種情況下,我有一個疑問。這兩個存儲庫會有不同的連接還是共享相同的連接? – piyush

+1

只要他們使用相同的羣集,他們將共享盡可能多的資源,包括連接 –

+0

有沒有一種方法可以爲這兩個存儲庫建立不同的連接。其中一個存儲庫僅用於讀取操作,另一個用於讀取/寫入操作。由於相同的連接,我們看到性能問題並不確定是否屬於這種情況。 – piyush

1

可能你想說的是,Spring引導提供了可以修改的預定義屬性,例如:couchbase.cluster.bucket,它具有單一值,並且你想連接兩個或多個桶。

如果你不能找到更好的解決方案,我可以指出你有一個稍微不同的方法,那就是設置你自己的couchbase連接管理器,你可以在任何你需要的地方注入。

以下是@Service的示例,它將爲您提供兩個連接到不同存儲桶的連接。

您可以修改以適應您的需求,它非常小。

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

我使用Spring引導CouchbaseRepository來獲得這種情況下所有凝乳操作的實現。我不認爲我將能夠注入或春季啓動將能夠給我兩個桶的凝乳作業實施。 – piyush

+0

我正在考慮爲每個存儲桶配置不同的配置類,並且爲每個數據庫配置我可以提供@EnableCouchbaseRepositories(basePackages = {「com.gp.api.common.repo.couchbase」}),以便它能夠識別正確的回購並使用凝乳操作爲每個桶實例化正確的回購。 – piyush