我試圖使用彈簧啓動連接到兩個不同的桶在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」)' –