Asyncオプション
非同期データベース・アダプタの使用例をいくつか紹介します。
- Postgres: https://github.com/actix/examples/tree/master/databases/postgres
- SQLite: https://github.com/actix/examples/tree/master/databases/sqlite
- MongoDB: https://github.com/actix/examples/tree/master/databases/mongodb
Diesel
Dieselの現在のバージョン(v1/v2)は非同期操作をサポートしていません。したがって、データベース操作をActixランタイムのスレッドプールにオフロードするために、web::block
関数を使用することが重要です。
アプリケーションがデータベースに対して実行するすべての操作に対応して、アクション関数を作成することができます。
ここで、r2d2
などのクレートを使用して、データベースプールをセットアップする必要があります。これは、アプリで多くの DB 接続を利用できるようにするものです。これは、複数のハンドラが同時にDB を操作でき、なおかつ新しい接続を受け入れることができることを意味します。単純に、アプリのステートにあるプールを利用します。(この場合、プールが共有アクセスを処理するため、ステート・ラッパー構造体を使用しない方が良いでしょう。)
さて、リクエストハンドラで、Data<T>
エクストラクタを使用して、アプリのステートからプールを取得し、そこから接続を取得します。これにより、web::block
クロージャに渡すことが可能な、所有権を保持した状態のデータベース接続(owned database connection)が提供されます。そして、必要な引数でアクション関数を呼び出し、結果を待つ(.await
)だけです。
この例では、エラーをHttpResponse
にマップしてから?
演算子を使用していますが、戻り値のエラータイプがResponseError
を実装している場合は、この方法は必要ありません。
以上です。
より詳細なDieselサンプルは下記をご参照ください。 https://github.com/actix/examples/tree/master/databases/diesel