前提・実現したいこと
python3とMySQLモジュールmysql-connectorを使ってイベント発生によるMySQLデータベースにログを出力するデーモンスクリプトを作成しました。
イベントによるMySQLの接続/切断はコストが掛かるので、デーモン起動時に一度だけ接続し、イベントが発生したときにその接続ハンドルを使ってINSERT処理を行うようにしています。
ちなみにイベントとはMQTTによるデータの受信をおこなっています。
発生している問題・エラーメッセージ
通常イベント発生と同時にSQLにてINSERTを実行し、所定のテーブルに書込まれていますが、突然書き込まれなくなってしまいます。
デーモンを再起動すれば、また書込まれるようになります。
書込まれなくなったときのエラーメッセージ以下のものが返されますので、おそらくデーモン起動時の接続が切断されたのだと思います。
"MySQL Connection not available."
実際に接続が切れるケースとして一晩とか長時間イベントが発生せず接続したままアイドル状態が続いているときに起こるようなのです。
実装
接続を永続するためにmysql-connectorにはpingメソッドがあるので、それに依存して再接続の実装はしていないのですが、pingメソッドが機能していないように思うので、なにか使い方の問題や注意点などがあればご指摘賜りたいと思います。
要約したソースコード
python
1import paho.mqtt.client as mqtt 2import mysql.connector 3 4def on_message(client, userdata, msg): # イベントドリブン 5 sql = "INSERT INTO event (topic) value ('{0}')".format(msg.topic) 6 cur = conn.cursor() 7 cur.execute(sql) 8 cur.close() 9 10# MySQLコネクションの作成 11conparm = {'host':'localhost','port':'3306', 'user': 'hoge', 'password':'hoge','database':'hoge'} 12conn = mysql.connector.connect(**conparm) 13conn.autocommit = True 14conn.ping(reconnect=True) # 接続が切れた時に再接続してくれるよう設定 15 16client = mqtt.Client(protocol=mqtt.MQTTv311) # MQTTブローカーに接続 17client.on_message = on_message # 受信データのイベントドリブンの指定 18client.loop_forever() # 受信データのイベントを永続的に待ち受ける 19 20
補足情報(FW/ツールのバージョンなど)
OS: CentOS7
DBMS: MySQL 5.7.29
言語: Python 3.6.8
MySQLモジュール: mysql-connector-python 8.0.19
回答1件
あなたの回答
tips
プレビュー