質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4503閲覧

MySQLの永続的接続が切れる

XCUBE

総合スコア101

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/05/14 03:44

編集2020/05/14 07:52

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

XCUBE

2020/05/15 05:18 編集

おっしゃるとおりping を定期的にしてくれるのではないようですね。誤認していました。ありがとうございました。 ベストアンサーです。 今回の場合、DBのアクセスのタイミングはイベントに依存するのでスレッドの中で定期的にpingメソッドを呼び出すようにします。 ありがとうございました。
guest

回答1

0

自己解決

hoshi-takanoriさんよりご指摘いただいたことで、別スレッドから定期的にpingを行うよう実装し、今のころ問題なくコネクションが保たれています。

スレッド間で同じコネクションを参照するところに一抹の不安がありますが、ping程度なら特に問題ないと思ってこのまま様子を見ておきます。

投稿2020/05/18 00:20

編集2020/05/18 00:56
XCUBE

総合スコア101

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問