title: MySQL OperationalError when running a Flask server (Apache) for some days
body: <p>I have a <strong>Flask</strong> server under Apache which I'm using as a Rest API for an app and when the server is running for 2 - 3 days it suddenly stops working and raises <code>OperationalError: MySQL Connection not available.</code></p>
  
  <p>The error always happens at the <code>login</code> method because it's the first called when the app opens (but all methods follow the same pattern).</p>
  
  <p>This is the <code>login</code> method:</p>
  
  <pre><code>@app.route(LOGIN_API_URL, methods=['POST'])
  def login():
      if (request.method == 'POST'):
          cursor = connection.cursor(buffered=True, dictionary=True)
          cursor.execute('select * from users where username = %s', (request.form['username'],))
          user = cursor.fetchone()
          if user is None or user['password'] != str(request.form['password']):
              abort(403)
          else:
              cursor.execute('update users set last_login = (%s) where user_id = %s', str(int(round(time.time() * 1000))), user['user_id'],)
              utils.safe_commit(connection, cursor)
              return utils.sanitize_response({'status':200, 'message':'Logged in'})
  </code></pre>
  
  <p>Both <code>safe_commit</code> and <code>sanitize_response</code> follows:</p>
  
  <pre><code>def sanitize_response(response, is_array=False):
      if response is None:
          return '[]' if is_array else '{}'
      else:
          return jsonify(response)
  
  def safe_commit(connection, cursor):
      try:
          connection.commit()
      except:
          connection.rollback()
      finally:
          cursor.close()
  </code></pre>
  
  <p>At first I thought the problem was happening because I wasn't using <code>buffered=True</code> in a cursor that is calling <code>fetchone</code> method. But I added that parameter after reading <a href="https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorbuffered.html" rel="noreferrer">this</a>.</p>
  
  <p>This is my <code>wsgi</code> file:</p>
  
  <pre><code>#!/usr/bin/python
  import sys
  sys.path.append("/var/www/protestr/")
  from protestr import app as application
  </code></pre>
  
  <p>This is my <code>sites-available</code> <code>conf</code> file (I wanted to say that I have tried a lot of combinations of both <code>threads</code> and <code>processes</code> parameters and this combination is the one that keeps the server running for the most time, usally 2 - 3 days):</p>
  
  <pre><code>&lt;VirtualHost *:80&gt;
      ServerName protestr.tk
      DocumentRoot /var/www/protestr/
  
      WSGIDaemonProcess protestr user=www-data group=www-data processes=2 threads=25
      WSGIScriptAlias / /var/www/protestr/protestr.wsgi
  
      &lt;Directory /var/www/protestr&gt;
          WSGIProcessGroup protestr
          WSGIApplicationGroup %{GLOBAL}
          Require all granted
      &lt;/Directory&gt;
  &lt;/VirtualHost&gt;
  </code></pre>
  
  <p>These are the contents of the <code>error.log</code> file:</p>
  
  <pre><code>[Fri May 12 03:34:14.967624 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727] [2017-05-12 03:34:14,963] ERROR in app: Exception on /api/v1/users/login [POST]
  [Fri May 12 03:34:14.967812 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727] Traceback (most recent call last):
  [Fri May 12 03:34:14.967861 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1982, in wsgi_app
  [Fri May 12 03:34:14.967900 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]     response = self.full_dispatch_request()
  [Fri May 12 03:34:14.967937 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1614, in full_dispatch_request
  [Fri May 12 03:34:14.967973 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]     rv = self.handle_user_exception(e)
  [Fri May 12 03:34:14.968007 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1517, in handle_user_exception
  [Fri May 12 03:34:14.968043 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]     reraise(exc_type, exc_value, tb)
  [Fri May 12 03:34:14.968076 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1612, in full_dispatch_request
  [Fri May 12 03:34:14.968111 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]     rv = self.dispatch_request()
  [Fri May 12 03:34:14.968144 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1598, in dispatch_request
  [Fri May 12 03:34:14.968179 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]     return self.view_functions[rule.endpoint](**req.view_args)
  [Fri May 12 03:34:14.968251 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]   File "/var/www/protestr/protestr.py", line 89, in login
  [Fri May 12 03:34:14.968290 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]     cursor = connection.cursor(buffered=True, dictionary=True)
  [Fri May 12 03:34:14.968326 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]   File "/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", line 809, in cursor
  [Fri May 12 03:34:14.968363 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727]     raise errors.OperationalError("MySQL Connection not available.")
  [Fri May 12 03:34:14.968399 2017] [wsgi:error] [pid 18673:tid 2849002544] [remote 192.168.1.139:25727] OperationalError: MySQL Connection not available.
  </code></pre>
  
  <hr>
  
  <p><strong>ADDITIONAL INFORMATION:</strong></p>
  
  <p>I'm running Apache/2.4.10 under <a href="https://www.armbian.com/" rel="noreferrer">armbian</a> (Debian) in a Banana Pi.</p>
  
  <p>I really don't know why the server stops after running for a while, I think I have tried almost everything.</p>
  
  <hr>
  
  <p><strong>EDIT:</strong> I've added also <code>cursor.close()</code> before throwing the <code>403</code> error in the <code>login</code> method. But this is not relevant as I'm the only one logging in the app and I'm always entering the correct credentials.</p>
  
  <p><strong>EDIT 2:</strong> As @stamaimer told me, if I add <code>connection.ping()</code> before getting any cursor, it works well, but this approach seems like a hacky way to me and <strong>I don't know if it's a good solution or even why the MySQL server is dropping the connection.</strong></p>