如果键空间不存在,Cassandra 连接到集群
Posted
技术标签:
【中文标题】如果键空间不存在,Cassandra 连接到集群【英文标题】:Cassandra connect to cluster if keyspace does not exists 【发布时间】:2016-11-18 10:31:57 【问题描述】:当键空间不存在时,我在连接到 cassandra 时遇到问题。 我不想在应用程序中硬编码我的键空间。我想在 application.yml 中写键空间名称(我正在使用 spring boot)。我想创建与键空间关联的会话:
session = cluster.connect("keyspace");
我必须这样做,因为我无法在 @Accessor 接口中自动装配属性。
@Accessor
public interface PropertyAccessor
//cannot autowire this field
@Value("$database.keyspace")
String keyspace = "";
所以我的问题是:
keyspace不存在时如何连接cassandra集群,获取session对象与keyspace的关联?
如何从@Accessor 接口中的弹簧属性自动装配属性?
PS。我使用的是 casandra 3.7,所以我不能使用 spring-data-cassandra。
【问题讨论】:
【参考方案1】:例如,如果您创建了带有 @Accessor 注释的 CustomAccessorRepository
@Accessor
public interface CustomAccessorRepository
@Query("select from custom where id=':id')
CustomObject findById(@Param("id") String id);
你可以创建一些类并用@Configuration注解它,在这个类中创建一个返回你的访问器的@Bean
@Configuration
public class CassandraConfig
private Cluster cluster;
private Session session;
private MappingManager mappingManager;
@Value("$database.keyspace")
private String keyspace;
public CassandraConfig()
cluster = Cluster.builder()
.addContactPoints(nodes.split(","))
.withPort(port)
.build();
session = cluster.connect(keyspace)
mappingManager = new MappingManager(session);
@Bean
public CustomAccessorRepository customAccessorRepository()
return mappingManager.createAccessor(CustomAccessorRepository.class);
在此之后,您可以将访问器注入某些服务
@Autowired
private CustomAccessorRepository customAccessorRepository;
【讨论】:
语句You can't create session without keyspace.是错误的。 谢谢,是的,我错了,实际上有可能在没有键空间的情况下创建会话,但我认为这是一个不好的方法 你为什么这么认为? 这是一个复杂的问题,我可能是错的,但在这种情况下,您必须始终在查询中指定键空间,这可能会导致一些错误,当然,如果您在一项服务中有很多键空间,它会使用一个会话是一个很好的解决方案,但是在重复表中使用许多键空间可能会导致性能问题,我不确定在这种情况下这项服务是否设计得很好。以上是关于如果键空间不存在,Cassandra 连接到集群的主要内容,如果未能解决你的问题,请参考以下文章
在 EC2 Ruby on Rails 上连接到 datastax 集群上的 cassandra 节点
Cassandra - 开发中心无法连接到 Cassandra 集群的所有 3 个节点
Cassandra - Dev中心无法连接到Cassandra集群的所有3个节点