Spring BootでApache cassandraを使う – UDTも扱う

Cassandraのインストール

cassandraのインストールは以下を参考に行う

Cassandraのテーブル・データの準備

keyspaceとテーブルの作成は以下。keyspace名はstoreとしている。

bookという名前でテーブルを作成し、primary keyとしてbookのidとversionをセットして、それ以外のカラムにtitle, description, authorsがある。

今回はbookのカラムにauthorsを用意しリストでauthorを持つようにしている。authorはUDT(ユーザ定義型)で定義しカラムにはname, descriptionがある。

データの挿入は以下のように行う。

selectしてみてデータが表示されたら準備はOK。

データを取得するための実装

src以下のプロジェクト構成は以下。

build.gradleにcassandraを使う為のライブラリとしてspring-boot-starter-data-cassandraを追加。

cassandraのテーブル、カラムと対応するクラスはmodelフォルダ以下の3つで用意する。

Book.java

BookKey.java

Author.java

Bookクラスがテーブルのbookに対応し、Primary keyをBookKeyクラスとして切り出している。

Primary keyの少なくとも1つはPrimaryKeyColumでPartition keyとして設定しなければならないのでtype = PrimaryKeyType.PARTITIONEDがある。

BookクラスのList<Author> authors;でAuthorクラスをリストで取得できるようにしている。このとき、AuthorクラスにはUserDefinedTypeのアノテーションをつけなければならない。

このクラスらがAPIを通じて取得できることを確認するためにController, Service, Repositoryクラスを以下のように用意する。

BookController.java

BookService.java

BookRepository.java

BookRepositoryのRepositoryDefinitionではdomainClassで取得するテーブルクラスを、idClassでPrimary keyの型あるいはクラスを宣言する。

最後にcassandraに繋ぐためのConfigクラスとパラメータを管理するapplication.ymlを以下のように用意する。

CassandraConfig.java

application.yml

CassandraConfigクラスでは@Valueでapplication.ymlで宣言されたパラメータを取得し、clusterメソッド内でそれを用いてCassandraに繋ぐ為の設定をしている。

いくつか設定の説明を取り上げるとsetReadTimeoutMillis(5000)でcassandraの最大リードタイムを5秒にしている。なのでデータの読み込みに5秒以上かかったらタイムアウトエラーが起こる。

setMaxRequestsPerConnection(HostDistance.LOCAL, 10)ではcassandraへの1つのコネクションに対して同時にリクエストを投げれる数を10までとして設定している。

ここまで行ったらプロジェクトを起動して動作確認をする。

以下のようになっていればOK。

補足:QueryBuilderを用いたcqlの書き方

BookRepositoryクラスは上記ではinterfaceや@Queryを使ったやり方をしているが以下のように、QueryBuilderを使って書くこともできる。

BookRepository.java