2016-04-28 54 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