I am hosting a Python script on Heroku using a MySQL Database with ClearDB. I am using MySQL connector to connect to my database. I have no issues whatsoever, but sometimes (about once a day, not regularly) my application crashes with this error message:
('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
Full logs:
2021-06-17T22:37:31.736206+00:00 app[worker.1]: Traceback (most recent call last):
2021-06-17T22:37:31.736221+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/urllib3/connectionpool.py", line 699, in urlopen
2021-06-17T22:37:31.736501+00:00 app[worker.1]: httplib_response = self._make_request(
2021-06-17T22:37:31.736504+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/urllib3/connectionpool.py", line 445, in _make_request
2021-06-17T22:37:31.736730+00:00 app[worker.1]: six.raise_from(e, None)
2021-06-17T22:37:31.736730+00:00 app[worker.1]: File "<string>", line 3, in raise_from
2021-06-17T22:37:31.736843+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/urllib3/connectionpool.py", line 440, in _make_request
2021-06-17T22:37:31.737014+00:00 app[worker.1]: httplib_response = conn.getresponse()
2021-06-17T22:37:31.737034+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/http/client.py", line 1345, in getresponse
2021-06-17T22:37:31.737481+00:00 app[worker.1]: response.begin()
2021-06-17T22:37:31.737482+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/http/client.py", line 307, in begin
2021-06-17T22:37:31.737703+00:00 app[worker.1]: version, status, reason = self._read_status()
2021-06-17T22:37:31.737704+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/http/client.py", line 268, in _read_status
2021-06-17T22:37:31.737918+00:00 app[worker.1]: line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
2021-06-17T22:37:31.737919+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/socket.py", line 704, in readinto
2021-06-17T22:37:31.738221+00:00 app[worker.1]: return self._sock.recv_into(b)
2021-06-17T22:37:31.738222+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/ssl.py", line 1241, in recv_into
2021-06-17T22:37:31.738644+00:00 app[worker.1]: return self.read(nbytes, buffer)
2021-06-17T22:37:31.738645+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/ssl.py", line 1099, in read
2021-06-17T22:37:31.739025+00:00 app[worker.1]: return self._sslobj.read(len, buffer)
2021-06-17T22:37:31.739049+00:00 app[worker.1]: ConnectionResetError: [Errno 104] Connection reset by peer
2021-06-17T22:37:31.739050+00:00 app[worker.1]:
2021-06-17T22:37:31.739050+00:00 app[worker.1]: During handling of the above exception, another exception occurred:
2021-06-17T22:37:31.739050+00:00 app[worker.1]:
2021-06-17T22:37:31.739053+00:00 app[worker.1]: Traceback (most recent call last):
2021-06-17T22:37:31.739073+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/requests/adapters.py", line 439, in send
2021-06-17T22:37:31.739291+00:00 app[worker.1]: resp = conn.urlopen(
2021-06-17T22:37:31.739292+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/urllib3/connectionpool.py", line 755, in urlopen
2021-06-17T22:37:31.739602+00:00 app[worker.1]: retries = retries.increment(
2021-06-17T22:37:31.739603+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/urllib3/util/retry.py", line 532, in increment
2021-06-17T22:37:31.739842+00:00 app[worker.1]: raise six.reraise(type(error), error, _stacktrace)
2021-06-17T22:37:31.739846+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/urllib3/packages/six.py", line 734, in reraise
2021-06-17T22:37:31.740119+00:00 app[worker.1]: raise value.with_traceback(tb)
2021-06-17T22:37:31.740120+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/urllib3/connectionpool.py", line 699, in urlopen
2021-06-17T22:37:31.740385+00:00 app[worker.1]: httplib_response = self._make_request(
2021-06-17T22:37:31.740386+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/urllib3/connectionpool.py", line 445, in _make_request
2021-06-17T22:37:31.740589+00:00 app[worker.1]: six.raise_from(e, None)
2021-06-17T22:37:31.740593+00:00 app[worker.1]: File "<string>", line 3, in raise_from
2021-06-17T22:37:31.740708+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/urllib3/connectionpool.py", line 440, in _make_request
2021-06-17T22:37:31.740899+00:00 app[worker.1]: httplib_response = conn.getresponse()
2021-06-17T22:37:31.740903+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/http/client.py", line 1345, in getresponse
2021-06-17T22:37:31.741343+00:00 app[worker.1]: response.begin()
2021-06-17T22:37:31.741343+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/http/client.py", line 307, in begin
2021-06-17T22:37:31.741560+00:00 app[worker.1]: version, status, reason = self._read_status()
2021-06-17T22:37:31.741561+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/http/client.py", line 268, in _read_status
2021-06-17T22:37:31.741774+00:00 app[worker.1]: line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
2021-06-17T22:37:31.741778+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/socket.py", line 704, in readinto
2021-06-17T22:37:31.742070+00:00 app[worker.1]: return self._sock.recv_into(b)
2021-06-17T22:37:31.742070+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/ssl.py", line 1241, in recv_into
2021-06-17T22:37:31.742482+00:00 app[worker.1]: return self.read(nbytes, buffer)
2021-06-17T22:37:31.742483+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/ssl.py", line 1099, in read
2021-06-17T22:37:31.742863+00:00 app[worker.1]: return self._sslobj.read(len, buffer)
2021-06-17T22:37:31.742913+00:00 app[worker.1]: urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
For what I know, it's not an issue on my part. ClearDB, like many other database services, closes the connections for some reason (e.g inactive connections).
I've read other people's solutions about this error and most of them told to detect the disconnect event and recreate the connection using a connection pool instead of a simple connection. How would I do it in Python, using MySQL connector?