2016-05-01 9 views
3

ローカルのMySQLデータベースでCherryPy Webサーバー(Python 2.7)を使用しています。短いで は、新しいSQLクエリを実行するときに、いくつかの日後、私は次のエラーを取得する:CherryPy Pingデータベース接続または再接続

MySQL server has gone away 

私はこの問題にはいくつかのソースを見つけることができますが、それらは実際にCherryPyには関係ありません。 CherryPyを再起動すると問題が解決されます。私は、CherryPyが接続を失い、再接続できないと思いますか?

したがって、私の質問は:

  • はどのようにして、データベース接続を確認することができますし、それが生きていない場合は、再接続?または
  • 上記のエラーを回避するにはどうすればよいですか?。以下で

、私が使用していますいくつかの単純化されたコードのバージョンを示しています。私は何もサーバー上で起こっていないいくつかの日後にインデックスページを訪問した場合

def dbconnect(thread_index): 
    """ 
    Creates a database connection for each thread that CherryPy creates 
    :param thread_index: 
    """ 
    cherrypy.thread_data.db = MySQLdb.connect("localhost", "user", 
              "password", "databasename") 

class website(object): 

    @cherrypy.expose 
    def index(self): 
     c = cherrypy.thread_data.db.cursor() 
     c.execute("Select * from ATable") 
     (output,) = c.fetchone() 
     # generate some html output ... 


cherrypy.engine.subscribe('start_thread', dbconnect) 
website = website() 
cherrypy.quickstart(website) 

を今、インデックスメソッドがスローをMySQLサーバーが去りましたエラー。

うまくいけば、この質問は、CherryPyを使用している誰もが面白いかもしれないし、SQLエラーを1日受ける。 ありがとうございます:-)

答えて

2

CherryPyは、クライアントリクエストを処理するスレッドのプールを保持します。 start_threadは、それらのスレッドの1つが起動されると呼び出され、スレッドの作成時にデータベース接続が作成されます。いくつかのリクエストを処理してアイドル状態になった後、何かが接続を落としているかもしれません(おそらくmysqlクライアントか、サーバが接続されていない(likely)か、あるいはネットワーク上の中間サーバがアイドル接続を終了しているかもしれません)。そのスレッドの次のリクエストが到着したときにエラーが発生したときだけです。

これを解決するには簡単な方法がありますが、それぞれのリクエストで新しいDB接続を開くことです(dbconnecton_start_resourceなど)。

start_threadの両方の接続を設定することをお勧めしますが、接続の状態を確認して接続されていない場合は再接続する場合はon_start_resourceにしてください。

通常のmysql.Connectionオブジェクトと同じインターフェイスを持ち、切断されたときに自動的に再接続するMySQLReconnectDBのような、切断された接続を管理するオブジェクトを識別または作成します。 This answerは可能な解決策を提案します。次に、既存のstart_threadハンドラにそのインスタンスを使用します。

私はそれが完全な答えではないことを認識していますが、あなたに役立つ解決策を見つけるための基盤を提供することを願っています。

+0

私はリンクされたソリューションをしばらく試してみましたが、今のところすべてが動作します。クイックで汚れた解決策は、MySQLdb.OperationalErrorをキャッチし、dbconnectメソッドを再度呼び出して、現在のスレッドがデータベース接続を再開することです。 – PeteChro