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

标签 java spring-boot spring-data spring-cloud-config spring-data-cassandra

我们使用 Spring Boot 1.5.10 和 Spring Data for Apache Cassandra这一切都运作良好。

我们有一个新的要求,我们需要在服务启动和运行时连接到不同的 key 空间。

通过使用Spring Cloud Config Server,我们可以很方便的设置spring.data.cassandra.keyspace-name的值,但是不确定有没有办法可以动态切换(强制)服务以使用此新 key 空间,而无需先重新启动?

有什么想法或建议吗?

最佳答案

@RefreshScope 与属性/存储库一起使用不起作用,因为键空间绑定(bind)到 Cassandra Session bean。

将 Spring Data Cassandra 1.5 与 Spring Boot 1.5 结合使用,您至少有两个选择:

  1. 声明一个@RefreshScope CassandraSessionFactoryBean,另见CassandraDataAutoConfiguration .这将在刷新时中断所有 Cassandra 操作并重新创建所有相关 bean。
  2. 监听 RefreshScopeRefreshedEvent 并通过 USE my-new-keyspace; 更改键空间。这种方法侵入性较小,不会中断正在运行的查询。您基本上会使用事件监听器。

    @Component
    class MySessionRefresh {
    
      private final Session session;
      private final Environment environment;
    
      // omitted constructors for brevity
    
      @EventListener
      @Order(Ordered.LOWEST_PRECEDENCE)
      public void handle(RefreshScopeRefreshedEvent event) {
    
        String keyspace = environment.getProperty("spring.data.cassandra.keyspace-name");
        session.execute("USE " + keyspace + ";");
      }
    }
    

在 Spring Data Cassandra 2 中,我们引入了 SessionFactory抽象提供 AbstractRoutingSessionFactory用于 CQL/ session 调用的代码控制路由。

关于java - 如何动态设置 Spring Data Cassandra 键空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48753874/

相关文章:

java - 如何在 RecyclerView Adapter 中使用架构组件 ViewModel?

java - Spring启动问题-java.lang.IllegalArgumentException : Value must only contain valid chars

页面上的 Spring MVC + Thymeleaf div 未生成

java - Spring Data mongodb 日期范围查询

java - 为什么 Spring Data 给我这个反射异常?

Java Android : Set variable from AsyncTask?

java - 使用jsp替换结果集语句中存储在字符串中的mysql函数的值

Java Stream - 如何将计数器 i 添加到流的第 n 个值

java - JPA - JpaRepository 子记录具有父 ID 而不是实体记录,如果父记录已获取

java - Spring 数据休息 : How to search by another object's key?