当前位置: 代码网 > it编程>编程语言>Java > Springboot3.3 整合Cassandra 4.1.5的详细过程

Springboot3.3 整合Cassandra 4.1.5的详细过程

2024年07月03日 Java 我要评论
一、数据库搭建-- 创建keyspacecreate keyspace school with replication = {'class':'simplestrategy', 'replicatio

一、数据库搭建

-- 创建keyspace
create keyspace school with replication = {'class':'simplestrategy', 'replication_factor' : 1};
-- 创建表
create table student(
   id int primary key,  
   name text,  
   age int,  
   genders int,  
   address text ,
   interest set<text>,
   phone list<text>,
   education map<text, text>
);

二、引入依赖

<dependency>
	<groupid>org.springframework.boot</groupid>
	<artifactid>spring-boot-starter-data-cassandra</artifactid>
</dependency>
<!-- hutool是下面多线程导入数据引入 -->
<dependency>
	<groupid>cn.hutool</groupid>
	<artifactid>hutool-all</artifactid>
	<version>5.8.26</version>
</dependency>

三、配置文件

spring:
  application:
    name: spring-cassandra
  cassandra:
    keyspace-name: school
    contact-points:
      - 192.168.204.131:9042
    port: 9042
    username: ***
    password: ******
    local-datacenter: datacenter1
    request:
      timeout: 60s

检查cassandra的local-datacenter,可执行下面命令:

[root@localhost apache-cassandra]# bin/nodetool status

 四、创建一个实体类:

import lombok.data;
import org.springframework.data.cassandra.core.mapping.column;
import org.springframework.data.cassandra.core.mapping.primarykey;
import org.springframework.data.cassandra.core.mapping.table;
import java.io.serializable;
import java.util.list;
import java.util.map;
import java.util.set;
@data
@table(value="student")
public class student implements serializable {
    @primarykey
    private integer id;
    @column("name")
    private string name;
    @column("age")
    private integer age;
    @column("genders")
    private integer genders;
    @column("address")
    private string address;
    @column("interest")
    private set<string> interest;
    @column("phone")
    private list<string> phone;
    @column("education")
    private map<string, string> education;
}

五、创建一个controller

private final studentservice studentservice;
@getmapping("student")
public list<student> getstudentbyname(string name) {
	return studentservice.getstudentbyname(name);
}
@getmapping("count")
public long count() {
	return studentservice.count();
}
@getmapping("list")
public list<student> list(string name) {
	student student = new student();
	student.setname(name);
	return studentservice.list(student);
}
@getmapping("save")
public string sava() {
	for(int i = 0; i<100; i++) {
		try {
			thread.sleep(200);
		} catch (interruptedexception e) {
			throw new runtimeexception(e);
		}
		int finali = i;
		threadutil.execute(() -> {
			system.out.println("线程"+ finali +"运行");
			list<student> list = lists.newarraylist();
			for(int j=0; j<100; j++) {
				uuid uuid = uuid.randomuuid();
				int hash = uuid.tostring().hashcode();
				int maxtendigit = (int) math.pow(10, 10) - 1; // 10位整数的最大值
				int modhash = math.abs(hash % maxtendigit);
				student student = new student();
				student.setid(modhash);
				int random = (int) (math.random() * 100);
				student.setname("gg"+ random);
				student.setage(random);
				student.setgenders(1);
				student.setaddress("china");
				list.add(student);
//                    studentservice.save(student);
			}
			system.out.println("线程"+ finali +"开始批量插入");
			studentservice.batchsave(list);
			system.out.println("线程"+ finali +"结束批量插入");
		});
	}
	system.out.println("线程结束");
//        threadutil.waitfordie();
	return "success";
}

注意:cassandra 本身不适合用来做数据分析统计,比如 count,是需要去遍历数据库的,分布式数据库,那么就要通通遍历一次。小数据还可以,数据量大会报查询超时错误。

六、编写service查询数据

service接口省略

1、jpa方式查询

service实现

private final studentmapper studentmapper;
@override
public list<student> getstudentbyname(string name) {
	return studentmapper.getstudentbyname(name);
}

mapper接口

@query(value = "select id, address, age, genders, name, interest, phone, education from student where name = ?0 allow filtering")
list<student> getstudentbyname(string name);

allow filtering:

       如果你的查询条件里,有一个是根据索引查询,那其它非索引非主键字段,可以通过加一个allow filtering来过滤实现;

  虽然查询非索引非主键字段,但是只要加了allow filtering条件,它会先根据索引查出来的值,再对结果进行过滤;

    (如果不加allow filtering,而又有非索引列,这样是不允许的; 加上allow filtering,相当于在结果后再进行过滤。)

2、cassandratemplate方式查询

private final cassandratemplate cassandratemplate;
@override
public list<student> list(student queryinfo) {
	query query = query
			.query(where("name").is(queryinfo.getname()));
	query = query.withallowfiltering();
	query = query.columns(columns.from("id", "name", "age", "address", "genders", "interest", "phone", "education"));
	system.out.println(query);
	return this.cassandratemplate.select(query, student.class);
}
@override
public void save(student student) {
	this.cassandratemplate.insert(student);
}
/**
* 批量插入
*/
@override
public void batchsave(list<student> list) {
	cassandrabatchoperations batchops = cassandratemplate.batchops();
	batchops.insert(list);
	batchops.execute();
}
@override
public long count() {
	return cassandratemplate.count(student.class);
}

到此这篇关于springboot3.3 整合cassandra 4.1.5的文章就介绍到这了,更多相关springboot整合cassandra内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com