--Depuis que je n'ai jamais touché Cassandra, un record quand j'ai essayé de construire ~ application Spring Boot pour référencer / mettre à jour
Cassandra: http://cassandra.apache.org/doc/latest/ SpringDataCassandra: https://spring.io/projects/spring-data-cassandra property Élément de réglage: https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#data-properties
Installation
#Corps Cassandra
brew install cassandra
# CQL(Cassandra Query Language)
brew install cql
Commencez
cassandra -f
Connection error: ('Unable to connect to any servers', {'127.0.0.1': error(61, "Tried connecting to [('127.0.0.1', 9042)]. Last error: Connection refused")})
Ça ne bouge pas. .. .. Dans mon cas, il semble que JAVA_HOME ne devrait pas pointer vers le répertoire Java 11. .. .. Après l'avoir redéfini, il démarrera en toute sécurité!
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/
cassandra -f
Commencez quand même avec Homebrew!
vi /usr/local/etc/cassandra/cassandra-env.sh
#"Exporter JAVA" à la fin_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/Ajoutée
brew services start cassandra
Relier!
cqlsh
cqlsh localhost 9042 Avec ça
cqlsh
Reprendre d'ici L'explication des options détaillées est omise ici. .. ..
Concept correspondant à la base de données dans MySQL et Oracle
-- #Avant d'ajouter un espace de clés
DESCRIBE keyspaces
-- system_traces system_schema system_auth system system_distributed
-- #Espace clé "échantillon" ajouté
CREATE KEYSPACE sample WITH REPLICATION = {'class':'SimpleStrategy','replication_factor':1};
-- #Avant d'ajouter un espace de clés
DESCRIBE keyspaces
-- system_schema system_auth system sample system_distributed system_traces
À propos, la suppression est
DROP KEYSPACE sample;
USE sample
Ici, nous supposons simplement des données avec clé et valeur.
--Créer
CREATE TABLE t_sample (key text PRIMARY KEY, value text);
--Consultez la liste
DESCRIBE tables;
--Vérifier la définition de la table
DESCRIBE table t_sample;
À propos, la suppression est
DROP TABLE t_sample;
Utilisation de la table t_sample créée précédemment
--Référence (vide)
select * from t_sample;
--Référence (équivalente à ci-dessus)
select key, value from t_sample;
--enregistrement
INSERT INTO t_sample (key, value) VALUES ('key1', 'value1');
--Inscription (duplicata)
--La requête est réussie et se comporte comme une mise à jour
INSERT INTO t_sample (key, value) VALUES ('key1', 'value2');
--mise à jour
UPDATE t_sample SET value = 'value3' WHERE key = 'key1';
--Effacer
DELETE FROM t_sample WHERE key = 'key1';
C'est ma première expérience d'être mise à jour au lieu d'être jouée si je ne respecte pas
build.gradle
plugins {
id 'org.springframework.boot' version '2.2.4.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-cassandra'
//webflux est pour le contrôle de fonctionnement
implementation 'org.springframework.boot:spring-boot-starter-webflux'
compileOnly('org.projectlombok:lombok')
annotationProcessor('org.projectlombok:lombok')
}
application.yml
spring:
data:
cassandra:
keyspace-name: sample
Sample.java
import lombok.Value;
import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;
@Data
@Table("t_sample")
public class Sample {
@PrimaryKey
private String key;
private String value;
}
Application.java
@Slf4j
@SpringBootApplication
public class Application {
public static void main(String[] args) {
//SpringApplication.run(Application.class);
Cluster cluster = Cluster.builder()
.addContactPoints("localhost")
.withoutJMXReporting() //Erreur si non joint
.build();
Session session = cluster.connect("sample");
var template = new CassandraTemplate(session);
var data = new Sample("key1", "value1");
template.insert(data);
//Rechercher tout
var selected = template.select("SELECT * from t_sample", Sample.class);
log.info("selected: {}", selected);
//mise à jour
data = new Sample("key1", "value2");
template.update(data);
//Recherche conditionnelle
selected = template.select(Query.query(Criteria.where("key").is("key1")), Sample.class);
log.info("selected: {}", selected);
//Supprimer (PK spécifié)
template.deleteById("key1", Sample.class);
//Obtenez le numéro
var count = template.count(Sample.class);
log.info("count: {}", count);
//Connexion fermée
session.close();
cluster.close();
}
}
L'erreur suivante s'est produite à moins que «.withoutJMXReporting ()» ne soit décrit.
Exception in thread "main" java.lang.NoClassDefFoundError: com/codahale/metrics/JmxReporter
Tout d'abord, examinez combien de "spring-boot-starter-data-cassandra" enregistrera les beans
Cluster
--ʻOrg.springframework.boot.autoconfigure.cassandra.CassandraAutoConfigurationest enregistré en tant que bean --Il semble bon de définir les propriétés sous
spring.data.cassandra --
spring.data.cassandra.keyspace-name = échantillon`
Session
――Est-ce Session ou Session Factory? --ʻOrg.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration` est enregistré en tant que bean
spring.data.cassandra
CassandraTemplate
--Comme Session, ʻorg.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration` est enregistré comme bean.
Conclusion ... Soudain, utilisez Cassandra Template et c'est OK!
CassandraController.java
@RequiredArgsConstructor
@RestController
public class CassandraController {
private final CassandraTemplate template;
// curl localhost:8080
@GetMapping("")
public List<Sample> all() {
return template.select("SELECT * FROM t_sample", Sample.class);
}
// curl localhost:8080/key1
@GetMapping("/{key}")
public Sample getByKey(@PathVariable String key) {
return template.selectOneById(key, Sample.class);
}
// curl localhost:8080/insert -d '{"key":"key1","value":"value1"}' -X PATCH -H 'Content-Type: application/json'
@PatchMapping("/**")
public Sample patch(@RequestBody Sample sample) {
return template.insert(sample);
}
// curl localhost:8080/key1 -X DELETE
@DeleteMapping("/{key}")
public Boolean delete(@PathVariable String key) {
return template.deleteById(key, Sample.class);
}
}
Utilisez simplement ReactiveCassandraTemplate! N'oubliez pas de changer le type de retour en Flux ou Mono! (C'est aussi OK en tant qu'éditeur à la fois)
ReactiveCassandraController.java
@RequiredArgsConstructor
@RestController
@RequestMapping("/reactive")
public class ReactiveCassandraController {
private final ReactiveCassandraTemplate template;
// curl localhost:8080/reactive
@GetMapping("")
public Flux<Sample> all() {
return template.select("SELECT * FROM t_sample", Sample.class);
}
// curl localhost:8080/reactive/key1
@GetMapping("/{key}")
public Mono<Sample> getByKey(@PathVariable String key) {
return template.selectOneById(key, Sample.class);
}
// curl localhost:8080/reactive/insert -d '{"key":"key1","value":"value1"}' -X PATCH -H 'Content-Type: application/json'
@PatchMapping("/**")
public Mono<Sample> patch(@RequestBody Sample sample) {
return template.insert(sample);
}
// curl localhost:8080/reactive/key1 -X DELETE
@DeleteMapping("/{key}")
public Mono<Boolean> delete(@PathVariable String key) {
return template.deleteById(key, Sample.class);
}
}
Recommended Posts