我正在尝试使用弹簧启动连接到couchbase中的两个不同的桶。但是在单个spring引导应用程序中,数据库配置只占用一个存储桶名称。
是否可以在弹簧靴中连接多个沙发基地桶?
答案 0 :(得分:3)
因此,您似乎希望在Spring Boot应用程序中使用Spring Data Couchbase,并且(至少)有两个不同的存储库由两个不同的Bucket
支持?
您必须以编程方式自定义Spring Data配置(而不是让Spring Boot完成所有繁重工作),但这是可能的。
CouchbaseConfigurer
,通过它创建默认Cluster
和Bucket
(在属性文件中调整)。CouchbaseRepository
,它还会尝试通过实例化SpringBootCouchbaseDataConfiguration
类来配置Spring Data。SpringBootCouchbaseDataConfiguration
来对其进行自定义,并将其标记为@Configuration
一旦准备好以编程方式自定义Spring Data配置,您需要创建第二个Bucket
bean,第二个CouchbaseTemplate
使用该存储桶,然后指示Spring Data Couchbase与Repository
。
为此,有configureRepositoryOperationsMapping(...)
方法。您可以将此方法的参数用作构建器:
Repository
界面与CouchbaseTemplate
相关联: map
mapEntity
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
并不能真正起作用。我竭尽全力尝试使其工作,最终决定将所有存储库放在一个程序包中,最终得到如下所示的内容来映射Entities
和Templates
。
baseMapping.mapEntity(Prime.class, noSQLSearchDBTemplate())
.mapEntity(PrimeDetailsMaster.class, noSQLSearchDBTemplate())
.mapEntity(HostDetailsMaster.class, noSQLSearchDBTemplate())
.mapEntity(Events.class, eventsTemplate())
.mapEntity(EventRulesMaster.class, eventsTemplate());