我想替换由自定义 Bucket 对象(其中用户名是 <> bucketName)和 Cluster 对象在启动时生成的 spring couchbaseTemplate 对象。我能够创建应用程序并使应用程序运行。CouchbaseTemplate 也被调用。2 天后,我将获得新的用户名、密码。所以我想在 spring 上下文中重新加载 couchbaseTemplate、Cluster 和 Bucket - 3 个新对象,以便新的 couchbaseTemplate 开始运行。我试图从 applicationContext 替换 couchbaseTemplate通过调用。
applicationContext.destroyBean( "couchbaseTemplate",applicationContext.getBean("couchbaseTemplate"))
applicationContext.registerSingleton( "couchbaseTemplate",couchbaseTemplate);
但是这段代码对我不起作用,并且说 bean 仍然存在于上下文中。我的问题是
- 这是正确的做法吗?
- 有没有更简洁的方法来设置 couchbaseTemplate、cluster 和 Bucket 对象而不影响实时事务。
- RefreshScope 方法在这里重新加载 bean 有帮助吗?但是,这并不能保证所有依赖的 bean 重新加载都依赖于用 @RefreshScope 注释的 bean。
couchbase DB 的点击量是 100/second 。
进一步的发现我进一步尝试发现可以修改 spring-data-couchbase 存储库以允许使用 AtomicReference 在 CouchbaseTemplate.java 中设置 Bucket 以供客户端使用 Bucket
AtomicReference<Bucket> bucketRef ;
Bucket getClient(atomicReferenceBucket.get()) ;
void setAtomicReferenceBucket(Bucket bucket) {
AtomicReference<Bucket> bucketRef= new AtomicReference(bucket) ;
return bucketRef;
}
resetBucket(Bucket bucket){
bucketRef.set(bucket);
}
用 getClient() 方法替换所有客户端
但是,当我交换使用新用户名和密码创建的存储桶时,我会在第一次请求时收到 requestCancelledInFlightException。请建议。