ググると古い情報しか出ないのでメモ。Dealing with Disconnects に対策が書いてある。
SQLAlchemy の create_engine で作った Engine は標準で Connection Pool が有効なので、DB 接続を使い回すようなっている。ただ、このままだと再利用しようと思った接続が勝手に切れていたり、DB が再起動した場合に次回 SQL を発行した時に Lost connection エラーになる事がある。例えば長時間アクセスしなかった DB にアクセスすると、エラーが発生する。この抑止方法として二つの方法が紹介されている。
- 悲観的な切断検出は、DB 接続を利用する前にかならず "SELECT 1" などの簡単な SQL を発行して接続を確認する。実装方法は
create_engine
にpool_pre_ping
引数を渡すだけなので簡単だが、ちょっとオーバーヘッドがある。 - 楽観的な切断検出は、DB に接続する時にエラーが出たら一度だけリトライを行う(?)というもの。SQLAlchemy は切断を検知すると自動的に再接続を行う。という事だと思うけど、いまいちコードサンプルの意図が分からず自信が無い。