SQLAlchemyのStaticPoolって何?
エージェントが書いたコードを読みながら、処理内容を理解しています。SQLAlchemyのStaticPoolとは何か、を調べる機会がありましたので、記録しておきます。
前提として、SQLAlchemyには、接続管理の機能が内包されています。sqlalchemy.pool モジュールにその機能があります。コネクションプーリングを想像しますね。
というか公式ドキュメントを見ると、「Connection Pooling」と明記されています。
https://docs.sqlalchemy.org/en/20/core/pooling.html
その中に次のようなクラスがあります。
QueuePool- 決まった数の接続をキューで管理し、貸し出し・返却する。
- 本番で利用されることを想定したクラスです。
NullPool- 接続をプールせず、毎回開いて毎回閉じます。
- コネクションプーリングを無効化するためのクラスです。
StaticPool- プロセス全体で1本の接続を共有するためのクラスです。
- マルチスレッドで動く場合でも、同じ接続が共有されます。
SingletonThreadPool- スレッドごとに1本の接続を保持します。
- SQLAlchemyでSQLiteを選択すると、デフォルトはこちらが利用されます。
AssertionPool- デバッグ用のクラスです。
- 同時に2つ以上checkoutされたらエラーが発生します。
実際のコードはこの辺にあります。 ConnectionFairy という概念が登場するのが印象的です。
https://github.com/sqlalchemy/sqlalchemy/blob/main/lib/sqlalchemy/pool/impl.py
StaticPoolingは、SQLiteのインメモリDBを使う場面でよく使われます。