我试图使用弹簧启动连接到两个不同的桶在couchbase中。但是,在单个spring引导应用程序中,数据库配置只能使用一个存储桶名称。是否可以在弹簧启动时连接到两个不同桶的couchbase
是否可以在弹簧启动时连接到多个couchbase桶?
我试图使用弹簧启动连接到两个不同的桶在couchbase中。但是,在单个spring引导应用程序中,数据库配置只能使用一个存储桶名称。是否可以在弹簧启动时连接到两个不同桶的couchbase
是否可以在弹簧启动时连接到多个couchbase桶?
因此,看来你想在春天启动应用程序内使用Spring数据Couchbase,并有(至少)两个不同的版本库由两个不同的Bucket
支持?
您必须以编程方式自定义您的Spring Data配置(而不是让Spring Boot完成所有繁重的工作),但这是可能的。
CouchbaseConfigurer
,通过它创建默认Cluster
和Bucket
(如在特性调谐的文件)。CouchbaseRepository
,它还会尝试通过实例化SpringBootCouchbaseDataConfiguration
类来配置Spring数据。SpringBootCouchbaseDataConfiguration
,将其标记为@Configuration
一旦你准备编程自定义春数据配置,你需要的是创建第二个Bucket
豆,第二个CouchbaseTemplate
使用该存储桶,然后指示Spring Data Couchbase使用哪个模板与哪个模板使用Repository
。
为此,有一个configureRepositoryOperationsMapping(...)
方法。您可以使用此方法的参数作为一个建设者到:
Repository
接口与CouchbaseTemplate
:map
mapEntity
setDefault
。第二部分在Spring Data Couchbase documentation中解释。
可能你想说的是,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";
}
不确定你的意思。你应该总是可以做'Cluster.openBucket(“name”,“password”)' –