如果键空间不存在,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个节点

如何动态设置 Spring Data Cassandra 键空间?

使用 java 模拟多个用户连接到 Cassandra

使用 datastax java 驱动程序 2.1.4 连接到 Cassandra 集群的速度太慢