[JAVA] Record de lutte pour Cassandra x Spring Boot

Résumé de cet article

--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

référence

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

Bâtiment Cassandra

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

Jouons seul à Cassandra pendant un moment

cqlsh

Reprendre d'ici L'explication des options détaillées est omise ici. .. ..

Ajouter KeySpace

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;

Déplacer la base de données

USE sample

Créer une table

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;

Manipulation de données

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

Créer une application Spring

création de projet

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

Créer une classe de modèle pour la table

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;
}

Essayez de vous inscrire / référencer / supprimer

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

Essayez de le faire ressembler à une application Web

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 sousspring.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

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);
    }
}

Support réactif

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

Record de lutte pour Cassandra x Spring Boot
Fiche d'apprentissage SPRING BOOT 01
Fiche d'apprentissage SPRING BOOT 02
Paramètres du chemin de contexte Spring Boot 2.x
Utiliser le cache avec EhCashe 2.x avec Spring Boot
Défi Spring Boot
Forme de botte de printemps
Spring Boot Rappelez-vous
gae + botte à ressort
Utiliser le filtre de servlet avec Spring Boot [compatible Spring Boot 1.x, 2.x]
[Java] Hello World avec Java 14 x Spring Boot 2.3 x JUnit 5 ~
Procédure de construction de LINE Bot x Java (Spring Boot)
Botte de printemps + Heroku Postgres
Rédaction de mémo de démarrage de printemps (1)
Un mémorandum de dépendance à Spring Boot2 x Doma2
Première botte à ressort (DI)
Aide-mémoire Spring Boot2
Gestion des exceptions Spring Boot
Mappage du servlet Spring Boot
Environnement de développement-développement Spring Boot-
Procédure d'apprentissage Spring Boot
SSO avec GitHub OAuth dans l'environnement Spring Boot 1.5.x
Apprentissage de Spring Boot [Début]
Rédaction de mémos de démarrage de printemps (2)
Résumé du document Spring Boot 2.2
[Spring Boot] DataSourceProperties $ DataSourceBeanCreationException
Disponibilité de l'application Spring Boot 2.3
Tutoriels Spring Boot Sujets
Télécharger avec Spring Boot
Spring Boot 1.x atteindra EOL l'année prochaine.
[Spring Boot] Construction de l'environnement (macOS)
Définir le paramètre contextuel dans Spring Boot
Essayez Spring Boot de 0 à 100.
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Implémenter GraphQL avec Spring Boot
Calendrier des tâches du didacticiel Spring Boot
Spring 5 et Spring Boot 2 Procédure de préparation pratique
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Multi-projets Spring Boot 2 avec Gradle
[Spring Boot] Création d'applications Web
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Paramètres d'échange à chaud Spring Boot
[Java] Thymeleaf Basic (Spring Boot)
Introduction à Spring Boot ① ~ DI ~
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Introduction à Spring Boot ② ~ AOP ~
Application Java CICS-Run - (4) Application Spring Boot
Spring Boot à partir de Docker
Spring Boot + Springfox springfox-boot-starter 3.0.0 Utilisation
Conseils relatifs à Spring Boot DB
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
[Spring Boot] Recette de processus de pagination facile
Utiliser Spring JDBC avec Spring Boot
Construction de l'environnement Docker × Spring Boot
Changements majeurs dans Spring Boot 1.5