簡體   English   中英

如何動態設置Spring Data Cassandra鍵空間?

[英]How to set Spring Data Cassandra keyspace dynamically?

我們將Spring Boot 1.5.10與Spring Data一起用於Apache Cassandra ,這一切都運行良好。

我們已經有了新的要求,我們需要在服務啟動和運行時連接到不同的密鑰空間。

通過使用Spring Cloud Config Server,我們可以輕松設置spring.data.cassandra.keyspace-name的值,但是,我們不確定是否有辦法可以動態切換(強制)服務使用它新密鑰空間,如果先沒有重新啟動?

任何想法或建議?

是的,你可以在持有spring.data.cassandra.keyspace-name值的bean上使用@RefreshScope注釋。

通過Spring Cloud Config Server更改配置值后,您必須在應用程序的/refresh端點上發出POST。

Spring雲文檔

當配置發生變化時,標記為@RefreshScope的Spring @Bean將得到特殊處理。 這解決了有狀態bean的問題,只有在初始化時才會注入其配置。 例如,如果數據源在通過環境更改數據庫URL時具有打開的連接,我們可能希望這些連接的持有者能夠完成他們正在做的事情。 然后,當有人從池中借用連接時,他會獲得一個帶有新URL的連接。

RefreshScope類 javadoc:

一種Scope實現,允許在運行時動態刷新bean(請參閱refresh(String)和refreshAll())。 如果刷新bean,則下次訪問bean時(即執行方法)將創建一個新實例。 所有生命周期方法都應用於bean實例,因此在刷新時會調用在bean工廠中注冊的任何銷毀回調,然后在創建新實例時正常調用初始化回調。 從原始bean定義創建新的bean實例,因此在創建時會重新評估任何外化內容(屬性占位符或字符串文字中的表達式)。

@RefreshScope與屬性/存儲庫一起使用@RefreshScope ,因為鍵空間綁定到Cassandra Session bean。

使用Spring Data Cassandra 1.5和Spring Boot 1.5,你至少有兩個選擇:

  1. 聲明@RefreshScope CassandraSessionFactoryBean ,另請參閱CassandraDataAutoConfiguration 這將在刷新時中斷所有Cassandra操作並重新創建所有依賴bean。
  2. 收聽RefreshScopeRefreshedEvent並通過USE my-new-keyspace;更改密鑰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抽象,為CQL /會話調用的代碼控制路由提供了AbstractRoutingSessionFactory

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM