是否可以在弹簧靴中连接两个不同的沙发基座

时间:2016-04-28 15:30:58

标签: spring-boot couchbase bucket

我正在尝试使用弹簧启动连接到couchbase中的两个不同的桶。但是在单个spring引导应用程序中,数据库配置只占用一个存储桶名称。

是否可以在弹簧靴中连接多个沙发基地桶?

3 个答案:

答案 0 :(得分:3)

因此,您似乎希望在Spring Boot应用程序中使用Spring Data Couchbase,并且(至少)有两个不同的存储库由两个不同的Bucket支持?

您必须以编程方式自定义Spring Data配置(而不是让Spring Boot完成所有繁重工作),但这是可能的。

  • Spring Boot会创建一个CouchbaseConfigurer,通过它创建默认ClusterBucket(在属性文件中调整)。
  • 如果类路径上有CouchbaseRepository,它还会尝试通过实例化SpringBootCouchbaseDataConfiguration类来配置Spring Data。
  • 您可以通过在项目中展开上面的SpringBootCouchbaseDataConfiguration来对其进行自定义,并将其标记为@Configuration

一旦准备好以编程方式自定义Spring Data配置,您需要创建第二个Bucket bean,第二个CouchbaseTemplate使用该存储桶,然后指示Spring Data Couchbase与Repository

一起使用的模板

为此,有configureRepositoryOperationsMapping(...)方法。您可以将此方法的参数用作构建器:

  • 将特定Repository界面与CouchbaseTemplate相关联: map
  • 说任何具有特定实体类型的回购都应该使用给定的模板: mapEntity
  • 甚至重新定义要使用的默认模板(最初是Spring Boot创建的模板): setDefault

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

答案 1 :(得分: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";
}

答案 2 :(得分:0)

我遵循西蒙的方法,将org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration的范围从@Configuration扩展到SpringBootCouchbaseDataConfiguration

此外,值得一提的是,由于某些原因,拥有单独的Repository软件包并拥有自己的@Configuration并不能真正起作用。我竭尽全力尝试使其工作,最终决定将所有存储库放在一个程序包中,最终得到如下所示的内容来映射EntitiesTemplates

baseMapping.mapEntity(Prime.class, noSQLSearchDBTemplate())
                .mapEntity(PrimeDetailsMaster.class, noSQLSearchDBTemplate())
                .mapEntity(HostDetailsMaster.class, noSQLSearchDBTemplate())
                .mapEntity(Events.class, eventsTemplate())
                .mapEntity(EventRulesMaster.class, eventsTemplate());