【问题标题】:Using multiple keyspaces working with Spring Boot 2.4.0/Spring Data Cassandra 3.1.1使用与 Spring Boot 2.4.0/Spring Data Cassandra 3.1.1 一起使用的多个键空间
【发布时间】:2021-03-28 06:21:54
【问题描述】:

我正在开发一个在 cassandra 数据库中使用两个不同键空间的 Spring Boot 应用程序。在尝试从 spring boot 2.1.7-RELEASE 升级到 2.4.0 版本的过程中,我发现我的基于 java 的配置不再起作用。由于创建了多个相同类型的 bean 以及由多个 cassandra/cql 会话工厂引起的歧义,扩展 AbstractCassandraConfiguration 似乎比以前困难得多。

我在网上找到的所有多键空间配置示例都是针对旧版本的 Spring Boot,所以我想知道是否有人想出了一个干净的方法来让它在更新的版本中工作?

【问题讨论】:

    标签: spring-boot spring-data-cassandra


    【解决方案1】:

    我正在使用 spring-data-cassandra=3.0.4.RELEASE。

    在我的项目中,我需要分别从 1 个 DC 连接到 2 个键空间。我在 Cassandra @Configuration Bean 中配置的是每个键空间 1 个 Session、SessionFactoryFactoryBean 和 CassandraOperations Bean。

    【讨论】:

      【解决方案2】:

      我将我的项目迁移到使用 spring-data-cassandra 3.x。我通过在配置中覆盖 CqlSessionFactoryBean bean 并为主键空间 cassandra 会话 bean 添加 @Primary 注释来解决冲突 bean 的问题。我的项目正在使用以下 gradle 依赖项:

      compile group: 'org.springframework.data', name: 'spring-data-cassandra', version: '3.0.5.RELEASE'
      compile group: 'com.datastax.oss', name: 'java-driver-core', version: '4.6.1'
      

      Cassandra 配置类:

      public abstract class AbstractCassandraSourceConfiguration extends AbstractCassandraConfiguration {
          @Autowired
          protected Environment environment;
      
          @Override
          protected int getPort() {
              return Integer.parseInt(environment.getProperty("cassandra.port"));
          }
      
          @Override
          protected String getContactPoints() {
              return environment.getProperty("cassandra.contactpoints");
          }
      
          @Override
          protected String getLocalDataCenter() {
              return environment.getProperty("cassandra.data.center",
                                             "datacenter1");
          }
      
          @Override
          protected abstract String getKeyspaceName();
      }
      
      @Configuration
      @EnableCassandraRepositories(basePackages = "com.data.cassandra.primary.repository",
                                   repositoryBaseClass = CassandraRepositoryWithTtlWithTimestampImpl.class)
      public class PrimaryCassandraSourceConfiguration extends AbstractCassandraSourceConfiguration {
          @Override
          protected String getKeyspaceName() {
              return "primary_keyspace";
          }
      
          @Override
          @Bean(name = "cassandraSession")
          @Primary
          public CqlSessionFactoryBean cassandraSession() {
              final CqlSessionFactoryBean session = super.cassandraSession();
              session.setKeyspaceName(getKeyspaceName());
              return session;
          }
      
          @Bean(name = "cassandraTemplate")
          public CassandraAdminOperations cassandraTemplate(
                  @Qualifier("cassandraSession") final CqlSessionFactoryBean session) {
              return new CassandraAdminTemplate(session.getObject(),
                                                cassandraConverter());
          }
      }
      
      @Configuration
      @EnableCassandraRepositories(cassandraTemplateRef = "secondaryCassandraTemplate",
                                   basePackages = "com.data.cassandra.secondary.repository",
                                   repositoryBaseClass = CassandraRepositoryWithTtlWithTimestampImpl.class)
      public class SecondaryCassandraSourceConfiguration extends AbstractCassandraSourceConfiguration {
          @Override
          protected String getKeyspaceName() {
              return "secondary_keyspace";
          }
      
          @Override
          @Bean(name = "secondaryCassandraSession")
          public CqlSessionFactoryBean cassandraSession() {
              final CqlSessionFactoryBean session = super.cassandraSession();
              session.setKeyspaceName(getKeyspaceName());
              return session;
          }
      
          @Bean(name = "secondaryCassandraTemplate")
          public CassandraAdminOperations cassandraTemplate(
                  @Qualifier("secondaryCassandraSession") final CqlSessionFactoryBean session) {
              return new CassandraAdminTemplate(session.getObject(),
                                                cassandraConverter());
          }
      }
      

      【讨论】:

      • 我做过类似的事情。但是,我的 Cassandra 具有基于用户名密码的身份验证。因此,我在启动服务器时遇到错误。
      • 尝试在CqlSessionFactoryBean cassandraSession上设置用户名和密码
      猜你喜欢
      • 2019-05-30
      • 2018-08-09
      • 2014-10-21
      • 2016-06-22
      • 1970-01-01
      • 2014-11-04
      • 2014-07-29
      • 2018-02-06
      • 2015-08-31
      相关资源
      最近更新 更多