必须使用Cassandra 3.9兼容的驱动(如cassandra-driver-core 3.11.5)和Spring Boot 2.7.x Starter,配置V3协议、禁用Actuator不兼容健康检查,并确保节点状态为UN且listen_address可访问,方可实现海量数据分布式存储。

要在Spring Boot项目中集成Apache Cassandra 3.9版本并实现海量数据的分布式存储能力,必须使用与Cassandra 3.9协议兼容的驱动和Starter,否则将出现连接拒绝、元数据解析失败或CQL执行异常等不可用问题。
确认Cassandra服务已就绪
启动Cassandra 3.9节点前,确保JDK 8+已安装且CASSANDRA_HOME环境变量指向解压目录;检查conf/cassandra.yaml中listen_address设为本机可访问IP(非localhost或127.0.0.1),rpc_address: 0.0.0.0已放开客户端连接。
执行bin/cassandra -R前台启动,随后运行bin/nodetool status,看到UN(Up/Normal)状态且Owns百分比非0,表示节点已加入集群并准备就绪。
【关键前提】Cassandra 3.9默认关闭Thrift服务,且不兼容4.x驱动的Native Protocol v5+,必须使用4.13.x及以下驱动版本。
添加cassandra-driver-core与spring-boot-starter-data-cassandra依赖
在pom.xml中引入适配Cassandra 3.9的驱动组合:
方法一:官方推荐组合(稳定、无反射警告)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra</artifactId>
<version>2.7.18</version>
</dependency>
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.11.5</version>
</dependency>
方法二:轻量级替代(仅需核心通信,跳过Spring Data封装)
直接引入cassandra-driver-core:3.11.5,手动构建Cluster和Session,适用于对连接生命周期有强控制需求的场景。此时无需Spring Data Cassandra Starter,避免自动配置冲突。
【易错点】spring-boot-starter-data-cassandra 3.x默认绑定driver 4.x,与Cassandra 3.9握手失败;必须降级至2.7.x系列并显式锁定3.11.5驱动。
配置application.yml启用Cassandra连接
第一步:指定基础连接参数
spring:<br> cassandra:<br> contact-points: 192.168.10.128,192.168.10.129<br> port: 9042<br> keyspace: myapp_keyspace<br> local-datacenter: datacenter1<br> schema-action: CREATE_IF_NOT_EXISTS
第二步:覆盖默认协议版本(强制v3)
在src/main/resources/application.yml末尾追加:
cassandra:<br> advanced:<br> protocol:<br> version: V3
第三步:禁用不兼容的健康检查端点(Cassandra 3.9不支持/metrics暴露)
management:<br> endpoints:<br> web:<br> exposure:<br> include: health,info
这一步不做会导致Actuator健康检查持续报DOWN,但实际连接正常——因为Cassandra 3.9未实现NodeProbe.getMetrics()接口。
定义实体并创建表结构
新建@Table标注的Java类,例如日志实体:
@Table(keyspace = "myapp_keyspace", name = "access_log")<br>public class AccessLog {<br> @PrimaryKey<br> private CompositeKey id;<br> private String ip;<br> private long timestamp;<br> private int statusCode;<br> // getter/setter省略<br>}
其中CompositeKey需实现Serializable并标注@PrimaryKeyClass,主键字段顺序必须与CQL中PRIMARY KEY (sensor_id, timestamp)完全一致。
启动应用时,若配置了schema-action: CREATE_IF_NOT_EXISTS,Spring Data会自动执行CREATE TABLE IF NOT EXISTS ...语句;若表已存在但列类型不匹配,不会自动变更,需手动执行ALTER TABLE。
执行批量写入以验证海量存储能力
① 注入CassandraTemplate实例
② 构建10万条AccessLog对象列表,每1000条分批调用cassandraTemplate.insert()
③ 观察nodetool tablestats myapp_keyspace.access_log输出中的Space used (total)与Number of partitions是否持续增长
这一步操作起来很简单,直接把文件拖进去就行。但注意:单次插入超过5000行可能触发RequestTimedOutException,因Cassandra 3.9默认read_request_timeout_in_ms: 10000,需在cassandra.yaml中同步调高该值并重启节点。

















