Spring Boot多Cassandra连接报错:unconfigured table(表实际存在)
Spring Boot多Cassandra数据库连接:解决'unconfigured table'错误
问题描述
在Spring Boot应用中配置了两个Cassandra数据库连接,对应CassandraConfig1和CassandraConfig2两个配置类,分别绑定repo1和repo2路径下的仓库。但使用repo2中的仓库执行查询时,出现unconfigured table错误,尽管目标表确实存在于对应数据库的Keyspace中。
现有配置代码
Config 1
@Configuration @EnableCassandraRepositories(basePackages = "com.example.microservice.cloud.dao.repo1") public class CassandraConfig1 extends AbstractCassandraConfiguration { @Override protected String getKeyspaceName() { return keySpace; } @Override protected String getContactPoints() { return contactPoints; } @Override protected int getPort() { return PORT; } @Bean() @Primary public CqlSessionFactoryBean cassandraMapSession() { final CqlSessionFactoryBean cqlSessionFactoryBean = super.cassandraSession(); cqlSessionFactoryBean.setContactPoints(contactPoints); cqlSessionFactoryBean.setKeyspaceName(keySpace); cqlSessionFactoryBean.setPort(PORT); cqlSessionFactoryBean.setUsername(cassandraUsername); cqlSessionFactoryBean.setPassword(cassandraPassword); return cqlSessionFactoryBean; } @Override public CqlSessionFactoryBean cassandraSession() { return cassandraMapSession(); } }
Config 2
@Configuration @EnableCassandraRepositories(basePackages = "com.example.microservice.cloud.dao.repo2") public class CassandraConfig2 extends AbstractCassandraConfiguration { @Override protected String getKeyspaceName() { return keySpace; } @Override protected String getContactPoints() { return contactPoints; } @Override protected int getPort() { return PORT; } @Bean() public CqlSessionFactoryBean cassandraMapSession() { final CqlSessionFactoryBean cqlSessionFactoryBean = super.cassandraSession(); cqlSessionFactoryBean.setContactPoints(contactPoints); cqlSessionFactoryBean.setKeyspaceName(keySpace); cqlSessionFactoryBean.setPort(PORT); cqlSessionFactoryBean.setUsername(cassandraUsername); cqlSessionFactoryBean.setPassword(cassandraPassword); return cqlSessionFactoryBean; } @Override public CqlSessionFactoryBean cassandraSession() { return cassandraMapSession(); } }
问题根源
- 两个配置类都重写了
cassandraSession()方法,且Config2的Session Bean没有唯一标识,导致Spring无法区分两个Session工厂。 @EnableCassandraRepositories未明确指定对应的Session工厂,repo2的仓库可能默认使用了Config1的@PrimarySession,连接到错误的Keyspace,从而找不到目标表。
修复方案
步骤1:为Config2的Session Bean指定唯一名称
在Config2的cassandraMapSession方法上添加唯一Bean名称:
@Bean("cassandraSession2") public CqlSessionFactoryBean cassandraMapSession() { // 原有代码不变 }
步骤2:绑定仓库到对应Session工厂
修改Config2的@EnableCassandraRepositories注解,指定sessionFactoryRef指向刚才定义的Bean:
@EnableCassandraRepositories( basePackages = "com.example.microservice.cloud.dao.repo2", sessionFactoryRef = "cassandraSession2" )
步骤3:移除冗余的cassandraSession()重写
删除两个配置类中的cassandraSession()重写方法,AbstractCassandraConfiguration会自动使用自定义的CqlSessionFactoryBean,避免逻辑混淆。
修改后的Config2完整代码
@Configuration @EnableCassandraRepositories( basePackages = "com.example.microservice.cloud.dao.repo2", sessionFactoryRef = "cassandraSession2" ) public class CassandraConfig2 extends AbstractCassandraConfiguration { @Override protected String getKeyspaceName() { return keySpace; } @Override protected String getContactPoints() { return contactPoints; } @Override protected int getPort() { return PORT; } @Bean("cassandraSession2") public CqlSessionFactoryBean cassandraMapSession() { final CqlSessionFactoryBean cqlSessionFactoryBean = super.cassandraSession(); cqlSessionFactoryBean.setContactPoints(contactPoints); cqlSessionFactoryBean.setKeyspaceName(keySpace); cqlSessionFactoryBean.setPort(PORT); cqlSessionFactoryBean.setUsername(cassandraUsername); cqlSessionFactoryBean.setPassword(cassandraPassword); return cqlSessionFactoryBean; } }
额外检查项
- 确认Config2中的
keySpace变量值正确指向包含目标表的Keyspace - 验证数据库账号拥有该Keyspace的读写权限
- 检查实体类的
@Table注解是否指定了正确的Keyspace(若未继承配置类的Keyspace设置)
内容的提问来源于stack exchange,提问作者Vishwanath M
相关产品推荐
相关产品推荐

