[英]Create keyspace, table and generate tables dynamically using 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,你至少有兩個選擇:
@RefreshScope
CassandraSessionFactoryBean
,另請參閱CassandraDataAutoConfiguration
。 這將在刷新時中斷所有Cassandra操作並重新創建所有依賴bean。 收聽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.