Spring Cassandra:在 运行 时间内在另一个键空间中创建模式
Spring Cassandra: Creating Schema in run time in another keyspace
我有 Spring 使用 spring-cassandra 的 Boot 2 项目,我在运行时使用 @RefreshScope 创建键空间,我正在执行查询以使用该键空间,但模式不是从带有@Table 注释的实体。
当我启动应用程序时,会创建一个新的键空间(如果不存在)并创建模式。之后,我更改 app.properties 中的密钥空间并将 POST 请求发送到 actuator/refresh。已创建并使用新的键空间,但未在该键空间中创建架构。
这是我的 Cassandra 配置:
@Configuration
@EnableCassandraRepositories
public class CassandraConfig extends AbstractCassandraConfiguration {
@Value("${cassandra.port}")
private int cassandraPort;
@Value("${cassandra.keyspace}")
private String KEYSPACE;
@Value("${cassandra.contactpoints}")
private String NODES;
@Bean
@Override
public CassandraCqlClusterFactoryBean cluster() {
CassandraCqlClusterFactoryBean bean = new CassandraCqlClusterFactoryBean();
bean.setKeyspaceCreations(getKeyspaceCreations());
bean.setContactPoints(NODES);
bean.setPort(cassandraPort);
return bean;
}
@Override
public SchemaAction getSchemaAction() {
return SchemaAction.CREATE_IF_NOT_EXISTS;
}
@Override
protected String getKeyspaceName() {
return KEYSPACE;
}
@Override
protected String getContactPoints() {
return NODES;
}
@Override
protected int getPort() {
return cassandraPort;
}
@Override
public String[] getEntityBasePackages() {
return new String[] {"package.entities"};
}
@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
List<CreateKeyspaceSpecification> createKeyspaceSpecifications = new ArrayList<>();
createKeyspaceSpecifications.add(getKeySpaceSpecification());
return createKeyspaceSpecifications;
}
// Below method creates "keyspace" if it doesn't exist.
private CreateKeyspaceSpecification getKeySpaceSpecification() {
DataCenterReplication dcr = DataCenterReplication.of("datacenter1", 3L);
return CreateKeyspaceSpecification.createKeyspace(KEYSPACE)
.ifNotExists()
.withNetworkReplication(dcr);
}
}
这是 RefreshScope class:
@Component
class MySessionRefresh extends AbstractCassandraConfiguration{
@Autowired
Environment env;
@Autowired
Session session;
@EventListener
@Order(Ordered.HIGHEST_PRECEDENCE)
public void handle(RefreshScopeRefreshedEvent event) {
String keyspace = env.getProperty("cassandra.keyspace");
session.execute("CREATE KEYSPACE IF NOT EXISTS " + keyspace + " WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3 };");
session.execute("USE " + keyspace + " ;");
}
我还需要做些什么才能在运行时为新键空间从带有@Table 的实体自动创建模式?
Spring Data Cassandra 中的模式创建与会话工厂 (CassandraSessionFactoryBean
) 关联,键空间创建与 Cluster
实例 (CassandraClusterFactoryBean
) 关联。您需要将 @RefreshScope
放在两个工厂上。
请记住,刷新会中断您的 Cassandra 操作。您还应该注意,模式创建不适用于生产用途。它在设计时考虑了集成测试和快速应用程序开发。
我有 Spring 使用 spring-cassandra 的 Boot 2 项目,我在运行时使用 @RefreshScope 创建键空间,我正在执行查询以使用该键空间,但模式不是从带有@Table 注释的实体。
当我启动应用程序时,会创建一个新的键空间(如果不存在)并创建模式。之后,我更改 app.properties 中的密钥空间并将 POST 请求发送到 actuator/refresh。已创建并使用新的键空间,但未在该键空间中创建架构。
这是我的 Cassandra 配置:
@Configuration
@EnableCassandraRepositories
public class CassandraConfig extends AbstractCassandraConfiguration {
@Value("${cassandra.port}")
private int cassandraPort;
@Value("${cassandra.keyspace}")
private String KEYSPACE;
@Value("${cassandra.contactpoints}")
private String NODES;
@Bean
@Override
public CassandraCqlClusterFactoryBean cluster() {
CassandraCqlClusterFactoryBean bean = new CassandraCqlClusterFactoryBean();
bean.setKeyspaceCreations(getKeyspaceCreations());
bean.setContactPoints(NODES);
bean.setPort(cassandraPort);
return bean;
}
@Override
public SchemaAction getSchemaAction() {
return SchemaAction.CREATE_IF_NOT_EXISTS;
}
@Override
protected String getKeyspaceName() {
return KEYSPACE;
}
@Override
protected String getContactPoints() {
return NODES;
}
@Override
protected int getPort() {
return cassandraPort;
}
@Override
public String[] getEntityBasePackages() {
return new String[] {"package.entities"};
}
@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
List<CreateKeyspaceSpecification> createKeyspaceSpecifications = new ArrayList<>();
createKeyspaceSpecifications.add(getKeySpaceSpecification());
return createKeyspaceSpecifications;
}
// Below method creates "keyspace" if it doesn't exist.
private CreateKeyspaceSpecification getKeySpaceSpecification() {
DataCenterReplication dcr = DataCenterReplication.of("datacenter1", 3L);
return CreateKeyspaceSpecification.createKeyspace(KEYSPACE)
.ifNotExists()
.withNetworkReplication(dcr);
}
}
这是 RefreshScope class:
@Component
class MySessionRefresh extends AbstractCassandraConfiguration{
@Autowired
Environment env;
@Autowired
Session session;
@EventListener
@Order(Ordered.HIGHEST_PRECEDENCE)
public void handle(RefreshScopeRefreshedEvent event) {
String keyspace = env.getProperty("cassandra.keyspace");
session.execute("CREATE KEYSPACE IF NOT EXISTS " + keyspace + " WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3 };");
session.execute("USE " + keyspace + " ;");
}
我还需要做些什么才能在运行时为新键空间从带有@Table 的实体自动创建模式?
Spring Data Cassandra 中的模式创建与会话工厂 (CassandraSessionFactoryBean
) 关联,键空间创建与 Cluster
实例 (CassandraClusterFactoryBean
) 关联。您需要将 @RefreshScope
放在两个工厂上。
请记住,刷新会中断您的 Cassandra 操作。您还应该注意,模式创建不适用于生产用途。它在设计时考虑了集成测试和快速应用程序开发。