Shishou Engineering Blog

Aim for Full Stack Engineer.

SQLAlchemyのエラー問題

KokemomoのDBアクセス部分で使用しているSQLAlchemyで、

コネクション周りのエラーが多発している模様・・。

DBへのコネクションがタイムアウトするとこの問題が起きるらしく、

他の方のブログなども参考にさせて頂いて調査していますが、今のところ未解決状態です。

 

sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back [SQL: 'SELECT km_blog_info.created_at AS km_blog_info_created_at, km_blog_info.updated_at AS km_blog_info_updated_at, km_blog_info.id AS km_blog_info_id, km_blog_info.name AS km_blog_info_name, km_blog_info.url AS km_blog_info_url, km_blog_info.description AS km_blog_info_description \nFROM km_blog_info \nWHERE km_blog_info.url = %s'] [parameters: [{}]]

 

 (2018/1/20追記)

この問題を調査した所、MySQLのwait_timeoutという設定が影響しているようでした。

wait_timeoutの確認方法は下記の通り。(この例の場合:28800=8時間)

MariaDB [(none)]> show global variables like "wait_timeout";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout| 28800 |
+---------------+-------+
1 row in set (0.00 sec)

 

MySQLは、この設定にセットされた時間よりも長くクライアントからの接続がない場合に、

自動的にコネクションを破棄するため、その後にSQLAlchemyからSQLを発行すると上記のようなエラーが発生するようです。

対応策としては、SQLAlchemyのcreate_engineを呼び出す際に、

wait_timeoutよりも短い時間をpool_recycleを指定してあげれば良さそうです。

pool_recycleについては公式のドキュメントにも書いてありました。

http://docs.sqlalchemy.org/en/latest/core/engines.html

 

ひとまずKokemomoでは下記のように設定ファイルからpool_recycleを指定できるように修正したので、

これで様子見です。

 

DATA_BASE_OPTIONS = {
'echo': True,
'pool_recycle': 3600,
}

 

※2018/1/23 追記

しばらくはエラーが出なかったのですが、再発しました。

ひとまずSQLAlchemyのバージョンを上げて再度様子見中です。

 

※2018/10/13 追記

どうやらKokemomo起動時にnohupコマンドを使用しているので、

そのログファイルが肥大化してプロセスがクラッシュしていることが原因のようでした。

ローテートさせるようにしたところ、エラーが発生しなくなりました。

 

2018-10-13 18:49:31


About
@hiroki8080

京都在住のフリーランスエンジニアです。

ITやIoT, 自作のCMS開発に関することを書いていきます。


主なスキル

Python, Java, C#

AWS, Unity

アプリケーション、フレームワーク、

ライブラリの設計、開発

お仕事のご依頼について

お仕事のご相談・ご依頼などありましたら、

お気軽にお問い合わせください。

e-mail:hiroki-m@gaia.eonet.ne.jp