ScalarDB をはじめよう
このページは英語版のページが機械翻訳されたものです。英語版との間に矛盾または不一致がある場合は、英語版を正としてください。
この入門チュートリアルでは、ScalarDB でデータベースを設定する方法について説明し、ScalarDB を使用してクレジットカードでアイテムを注文して支払うことができるサンプルの電子商取引アプリケーションを作成するプロセスを示します。サンプルの電子商取引アプリケーションでは、ユーザーがクレジットラインを使用してアイテムを注文して支払う方法を示します。
サンプルアプリケーションは ScalarDB の使用方法を示すことに重点を置いているため、アプリケ ーション固有のエラー処理、認証処理、および同様の機能はサンプルアプリケーションに含まれていません。ScalarDB での例外処理の詳細については、例外の処理方法を参照してください。
このサンプルアプリケーションの前提条件
ScalarDB は Java で記述されているため、環境に次のいずれかの Java Development Kit (JDK) がインストールされている必要があります。
- Eclipse Temurin の OpenJDK LTS バージョン (8、11、17、または 21)
- Docker 20.10以降と Docker Compose V2以降
このサンプルアプリケーションは、Eclipse Temurin の OpenJDK でテストされています。ただし、ScalarDB 自体は、さまざまなベンダーの JDK ディストリビューションでテストされています。互換性のある JDK ディストリビューションを含む ScalarDB の要件の詳細については、要件を参照してください。
ScalarDB サンプルリポジトリのクローンを作成する
Terminal を開き、次のコマンドを実行して ScalarDB サンプルリポジトリのクローンを作成します。
git clone https://github.com/scalar-labs/scalardb-samples
次に、次のコマンドを実行して、サンプルアプリケーションが含まれているディレクトリに移動します。
cd scalardb-samples/scalardb-sample
データベースをセットアップする
データベースを選択し、指示に従って ScalarDB 用に設定します。
ScalarDB がサポートするデータベースの一覧については、データベースを参照してください。
- MySQL
- PostgreSQL
- Oracle Database
- SQL Server
- DynamoDB
- Cosmos DB for NoSQL
- Cassandra
MySQLをローカルで実行する
scalardb-samples/scalardb-sample
ディレクトリの docker-compose.yml
ファイルを使用して、Docker Compose で MySQL を実行できます。
MySQL を起動するには、次のコマンドを実行します。
docker compose up -d mysql
ScalarDB を設定する
scalardb-samples/scalardb-sample
ディレクトリの database.properties ファイルには、ScalarDB のデータベース設定が含まれています。database.properties ファイル内の MySQL のプロパティのコメントを解除して、設定が次のようになるようにしてください。
# For MySQL
scalar.db.storage=jdbc
scalar.db.contact_points=jdbc:mysql://localhost:3306/
scalar.db.username=root
scalar.db.password=mysql
PostgreSQL をローカルで実行する
scalardb-samples/scalardb-sample
ディレクトリの docker-compose.yml
ファイルを使用して、Docker Compose で PostgreSQL を実行できます。
PostgreSQL を起動するには、次のコマンドを実行します。
docker compose up -d postgres
ScalarDB を設定する
scalardb-samples/scalardb-sample
ディレクトリの database.properties ファイルには、ScalarDB のデータベース設定が含まれています。database.properties ファイル内の PostgreSQL のプロパティのコメントを解除して、設定が次のようになるようにしてください。
# For PostgreSQL
scalar.db.storage=jdbc
scalar.db.contact_points=jdbc:postgresql://localhost:5432/
scalar.db.username=postgres
scalar.db.password=postgres
Oracle Database をローカルで実行する
scalardb-samples/scalardb-sample
ディレクトリの docker-compose.yml
ファイルを使用して、Docker Compose で Oracle Database を実行できます。
Oracle Database を起動するには、次のコマンドを実行します。
docker compose up -d oracle
ScalarDB を設定する
scalardb-samples/scalardb-sample
ディレクトリの database.properties ファイルには、ScalarDB のデータベース設定が含まれています。database.properties ファイル内の Oracle データベースのプロパティのコメントを解除して、設定が次のようになるようにしてください。
# For Oracle
scalar.db.storage=jdbc
scalar.db.contact_points=jdbc:oracle:thin:@//localhost:1521/FREEPDB1
scalar.db.username=SYSTEM
scalar.db.password=Oracle
SQL Server をローカルで実行する
scalardb-samples/scalardb-sample
ディレクト リの docker-compose.yml
ファイルを使用して、Docker Compose で SQL Server を実行できます。
SQL Server を起動するには、次のコマンドを実行します。
docker compose up -d sqlserver
ScalarDB を設定する
scalardb-samples/scalardb-sample
ディレクトリの database.properties ファイルには、ScalarDB のデータベース設定が含まれています。database.properties ファイル内の SQL Server のプロパティのコメントを解除して、設定が次のようになるようにしてください。
# For SQL Server
scalar.db.storage=jdbc
scalar.db.contact_points=jdbc:sqlserver://localhost:1433;encrypt=true;trustServerCertificate=true
scalar.db.username=sa
scalar.db.password=SqlServer22
Amazon DynamoDB をローカルで実行する
scalardb-samples/scalardb-sample
ディレクトリの docker-compose.yml
ファイルを使用して、Docker Compose で Amazon DynamoDB Local を実行できます。
Amazon DynamoDB Local を起動するには、次のコマンドを実行します。
docker compose up -d dynamodb
ScalarDB を設定する
scalardb-samples/scalardb-sample
ディレクトリの database.properties ファイルには、ScalarDB のデータベース設定が含まれています。database.properties ファイル内の Amazon DynamoDB Local のプロパティのコメントを解除して、設定が次のようになるようにしてください 。
# For DynamoDB Local
scalar.db.storage=dynamo
scalar.db.contact_points=sample
scalar.db.username=sample
scalar.db.password=sample
scalar.db.dynamo.endpoint_override=http://localhost:8000
Azure Cosmos DB for NoSQL を使用するには、Azure アカウントが必要です。Azure アカウントをお持ちでない場合は、Azure Cosmos DB アカウントを作成するにアクセスしてください。
Cosmos DB for NoSQL を設定する
既定の整合性レベルを構成するの公式ドキュメントに従って、既定の整合性レベルを強力に設定します。
ScalarDB を設定する
以下の手順では、ローカル環境に JDK が適切にインストールおよび設定されており、Azure で Cosmos DB for NoSQL アカウントが適切に設定されていることを前提としています。
scalardb-samples/scalardb-sample
ディレクトリの database.properties ファイルには 、ScalarDB のデータベース設定が含まれています。scalar.db.contact_points
と scalar.db.password
の値は、説明に従って必ず変更してください。
# For Cosmos DB
scalar.db.storage=cosmos
scalar.db.contact_points=<COSMOS_DB_FOR_NOSQL_URI>
scalar.db.password=<COSMOS_DB_FOR_NOSQL_KEY>
Azure Cosmos DB アカウントの主キーまたはセカンダリキーを scalar.db.password
の値として使用できます。
Cassandra をローカルで実行する
scalardb-samples/scalardb-sample
ディレクトリの docker-compose.yml
ファイルを使用して、Docker Compose で Apache Cassandra を実行できます。
Apache Cassandra を起動するには、次のコマンドを実行します。
docker compose up -d cassandra
ScalarDB を設定する
scalardb-samples/scalardb-sample
ディレクトリの database.properties ファイルには、ScalarDB のデータベース設定が含まれています。database.properties ファイル内の Cassandra のプロパティのコメントを解除して、設定が次のようになるようにしてください。
# For Cassandra
scalar.db.storage=cassandra
scalar.db.contact_points=localhost
scalar.db.username=cassandra
scalar.db.password=cassandra
データベーススキーマをロードする
アプリケーションでデータベーススキーマ (データを整理する方法) を定義する必要があります。サポートされているデータ型の詳細については、ScalarDB と他のデータベース間のデータ型マッピングを参照してください。
このチュートリアルでは、schema.json というファイルが scalardb-samples/scalardb-sample
ディレクトリに既に存在します。スキーマを適用するには、scalardb
Releases ページに移動し、使用している ScalarDB のバージョンに一致する ScalarDB Schema Loader を scalardb-samples/scalardb-sample
ディレクトリにダウンロードします。
次に、データベースに基づいて、<VERSION>
をダウンロードした ScalarDB Schema Loader のバージョンに置き換えて、次のコマンドを実行します。
- MySQL
- PostgreSQL
- Oracle Database
- SQL Server
- DynamoDB
- Cosmos DB for NoSQL
- Cassandra
java -jar scalardb-schema-loader-<VERSION>.jar --config database.properties --schema-file schema.json --coordinator
transaction
が true
に設定されたテーブルがスキーマ内に存在するため、--coordinator
オプションが指定されています。スキーマの設定とロードの詳細については、ScalarDB Schema Loader を参照してください。
java -jar scalardb-schema-loader-<VERSION>.jar --config database.properties --schema-file schema.json --coordinator
transaction
が true
に設定されたテーブルがスキーマ内に存在するため、--coordinator
オプションが指定されています。スキーマの設定とロードの詳細については、ScalarDB Schema Loader を参照してください。
java -jar scalardb-schema-loader-<VERSION>.jar --config database.properties --schema-file schema.json --coordinator
transaction
が true
に設定されたテーブルがスキーマ内に存在するため、--coordinator
オプションが指定されています。スキーマの設定とロードの詳細については、ScalarDB Schema Loader を参照してください。
java -jar scalardb-schema-loader-<VERSION>.jar --config database.properties --schema-file schema.json --coordinator
transaction
が true
に設定されたテーブルがスキーマ内に存在するため、--coordinator
オプションが指定されています。スキーマの設定とロードの詳細については、ScalarDB Schema Loader を参照してください。
java -jar scalardb-schema-loader-<VERSION>.jar --config database.properties --schema-file schema.json --coordinator --no-backup --no-scaling
transaction
が true
に設定されたテーブルがスキーマ内に存在するため、--coordinator
オプションが指定されています。スキーマの設定とロードの詳細については、ScalarDB Schema Loader を参照してください。
また、Amazon DynamoDB Local は継続的なバックアップと自動スケーリングをサポートしていないため、--no-backup
および --no-scaling
オプションが指定されて います。
java -jar scalardb-schema-loader-<VERSION>.jar --config database.properties --schema-file schema.json --coordinator
transaction
が true
に設定されたテーブルがスキーマ内に存在するため、--coordinator
オプションが指定されています。スキーマの設定とロードの詳細については、ScalarDB Schema Loader を参照してください。
java -jar scalardb-schema-loader-<VERSION>.jar --config database.properties --schema-file schema.json --coordinator --replication-factor=1
transaction
が true
に設定されたテーブルがスキーマ内に存在するため、--coordinator
オプションが指定されています。スキーマの設定とロードの詳細については、ScalarDB Schema Loader を参照してください。
また、--replication-factor=1
オプションは Cassandra を使用する場合にのみ有効です。デフォルトのレプリケーション係数は 3
ですが、このチュートリアルではセットアップを容易にするために 1
が使用されているため、3つのノードではなく1つのノードを持つクラスターを準備するだけで済みます。ただし、レプリケーション係数 1
は本番環境には適していないことに注意してください。
スキーマの詳細
サンプルアプリケーションの schema.json
に示されているように、すべてのテーブルは sample
名前空間に作成されます。
sample.customers
: 顧客情報を管理するテーブルcredit_limit
: 貸し手が顧客に信用枠から支出を許可する最大金額credit_total
: 顧客が信用枠から支出した金額
sample.orders
: 注文情報を管理するテーブルsample.statements
: 注文明細情報を管理するテーブルsample.items
: 注文するアイテムの情報を管理するテーブル
スキーマのエンティティ関係図は次のとおりです。
初期データをロードする
サンプルアプリケーションを実行する前に、次のコマンドを実行して初期データをロードする必要があります。
./gradlew run --args="LoadInitialData"
初期データがロードされた後、次のレコードがテーブルに保存される必要があります。
sample.customers
テーブル
customer_id | name | credit_limit | credit_total |
---|---|---|---|
1 | Yamada Taro | 10000 | 0 |
2 | Yamada Hanako | 10000 | 0 |
3 | Suzuki Ichiro | 10000 | 0 |
sample.items
テーブル
item_id | name | price |
---|---|---|
1 | Apple | 1000 |
2 | Orange | 2000 |
3 | Grape | 2500 |
4 | Mango | 5000 |
5 | Melon | 3000 |
サンプルアプリケーションでトランザクションを実行し、データを取得する
次のセクションでは、サンプル電子商取引アプリケーションでトランザクションを実行し、データを取得する方法について説明します。
顧客情報を取得する
まず、次のコマンドを実行して、ID が 1
である顧客に関する情報を取得します。
./gradlew run --args="GetCustomerInfo 1"
次の出力が表示されます。
...
{"id": 1, "name": "Yamada Taro", "credit_limit": 10000, "credit_total": 0}
...
注文する
次に、次のコマンドを実行して、顧客 ID 1
にリンゴ3個とオレンジ2個を注文してもらいます。
このコマンドの 注文形式は ./gradlew run --args="PlaceOrder <CUSTOMER_ID> <ITEM_ID>:<COUNT>,<ITEM_ID>:<COUNT>,..."
です。
./gradlew run --args="PlaceOrder 1 1:3,2:2"
以下のように、order_id
の UUID が異なる、注文が成功したことを示す類似の出力が表示されます。
...
{"order_id": "dea4964a-ff50-4ecf-9201-027981a1566e"}
...
注文の詳細を確認する
次のコマンドを実行して注文の詳細を確認します。<ORDER_ID_UUID>
は、前のコマンドを実行した後に表示される order_id
の UUID に置き換えます。
./gradlew run --args="GetOrder <ORDER_ID_UUID>"
order_id
と timestamp
の UUID が異なる、以下のような出力が表示されます。
...
{"order": {"order_id": "dea4964a-ff50-4ecf-9201-027981a1566e","timestamp": 1650948340914,"customer_id": 1,"customer_name": "Yamada Taro","statement": [{"item_id": 1,"item_name": "Apple","price": 1000,"count": 3,"total": 3000},{"item_id": 2,"item_name": "Orange","price": 2000,"count": 2,"total": 4000}],"total": 7000}}
...
別の注文をする
次のコマンドを実行して、顧客 ID 1
の credit_total
の残額を使用してメロン1個を注文します。
./gradlew run --args="PlaceOrder 1 5:1"
以下のように、order_id
の UUID が異なる、注文が成功したことを示す類似の出力が表示されます。
...
{"order_id": "bcc34150-91fa-4bea-83db-d2dbe6f0f30d"}
...
注文履歴を確認する
次のコマンドを実行して、顧客 ID 1
のすべての注文履歴を取得します。
./gradlew run --args="GetOrders 1"
order_id
と timestamp
の UUID が異なる以下のような出力が表示されます。これは、顧客 ID 1
のすべての注文履歴をタイムスタンプの降順で表示します。
...
{"order": [{"order_id": "dea4964a-ff50-4ecf-9201-027981a1566e","timestamp": 1650948340914,"customer_id": 1,"customer_name": "Yamada Taro","statement": [{"item_id": 1,"item_name": "Apple","price": 1000,"count": 3,"total": 3000},{"item_id": 2,"item_name": "Orange","price": 2000,"count": 2,"total": 4000}],"total": 7000},{"order_id": "bcc34150-91fa-4bea-83db-d2dbe6f0f30d","timestamp": 1650948412766,"customer_id": 1,"customer_name": "Yamada Taro","statement": [{"item_id": 5,"item_name": "Melon","price": 3000,"count": 1,"total": 3000}],"total": 3000}]}
...
クレジット合計を確認する
次のコマンドを実行して、顧客 ID 1
のクレジット合計を取得します。
./gradlew run --args="GetCustomerInfo 1"
次の出力が表示されます。これは、顧客 ID 1
が credit_total
の credit_limit
に達しており、これ以上注文できないことを示しています。
...
{"id": 1, "name": "Yamada Taro", "credit_limit": 10000, "credit_total": 10000}
...
次のコマンドを実行して、ブドウ1個とマンゴー1個を注文してみます。
./gradlew run --args="PlaceOrder 1 3:1,4:1"
次の出力が表示されます。これは、credit_total
金額が credit_limit
金額を超えたために注文が失敗したことを示しています。
...
java.lang.RuntimeException: Credit limit exceeded
at sample.Sample.placeOrder(Sample.java:205)
at sample.command.PlaceOrderCommand.call(PlaceOrderCommand.java:33)
at sample.command.PlaceOrderCommand.call(PlaceOrderCommand.java:8)
at picocli.CommandLine.executeUserObject(CommandLine.java:1783)
at picocli.CommandLine.access$900(CommandLine.java:145)
at picocli.CommandLine$RunLast.handle(CommandLine.java:2141)
at picocli.CommandLine$RunLast.handle(CommandLine.java:2108)
at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:1975)
at picocli.CommandLine.execute(CommandLine.java:1904)
at sample.command.SampleCommand.main(SampleCommand.java:35)
...
支払いを行う
注文を続行するには、顧客 ID 1
が支払いを行って credit_total
の金額を減らす必要があります。
次のコマンドを実行して支払いを行います。
./gradlew run --args="Repayment 1 8000"
次に、次のコマンドを実行して、顧客 ID 1
の credit_total
金額を確認します。
./gradlew run --args="GetCustomerInfo 1"
次の出力が表示されます。これは、顧客 ID 1
に支払いが適用され、credit_total
の金額が減ったことを示しています。
...
{"id": 1, "name": "Yamada Taro", "credit_limit": 10000, "credit_total": 2000}
...
顧客 ID 1
が支払いを済ませたので、次のコマンドを実行してブドウ1個とメロン1個を注文します。
./gradlew run --args="PlaceOrder 1 3:1,4:1"
以下のように、order_id
の UUID が異なる、注文が成功したことを示す類似の出力が表示されます。
...
{"order_id": "8911cab3-1c2b-4322-9386-adb1c024e078"}
...
データベースを停止する
データベースを停止するには、次のコマンドを実行して Docker コンテナを停止します。
docker compose down
参照
このチュートリアルで使用される電子商取引アプリケーションのソースコードを確認するには、Sample.java
を参照してください。