Почему MySQL на Amazon RDS сохраняет тайм-аут моих подключений после изменения переменных тайм-аута?

#python #mysql #python-3.x #amazon-web-services #amazon-rds

#python #mysql #python-3.x #amazon-web-services #amazon-rds

Вопрос:

Я арендовал базу данных MySQL через сервис Amazon RDS. Мне удалось привыкнуть к базе данных и я могу управлять ею на Python. Я пытаюсь установить время тайм-аута моего подключения к базе данных MySQL, но мне это не удается. Время ожидания моего подключения к базе данных MySQL через Python всегда истекает через 10-11 минут.

Чтобы изменить значение тайм-аута вашего сервера MySQL, вам необходимо получить доступ к его конфигурационному файлу. Я просмотрел документацию Amazon RDS и узнал, что в Amazon это делается с помощью «Групп параметров». Я создал новую группу параметров и установил значения: «connect_timeout», «interactive_timeout» и «wait_timeout» для каждого по 1000000. Я связал свою базу данных с этой группой параметров, а затем перезапустил ее. Я повторно подключился к своей базе данных на Python. Примерно через 10 минут бездействия время ожидания моего соединения все еще истекло.

Я пытался явно указать тайм-аут в Python в дополнение к указанию его в моей группе параметров, но по-прежнему безуспешно. Вот код, который я пытаюсь запустить:

 import time
import mysql.connector
DataBase = 'DataBase'
Username = 'Username'
Password = 'Password'
Host = 'mydb.randomstring.region.rds.amazonaws.com'
cnx = mysql.connector.connect(
    user=Username, 
    password=Password, 
    host=Host, 
    database=DataBase,
    connect_timeout=1000000
)
mycursor = cnx.cursor()
time.sleep(900)
if cnx.is_connected():
    print('Database did not time out.')
else:
    print('Database timed out.')

>>> Database timed out.
  

У кого-нибудь есть идеи относительно того, почему это происходит?

Кроме того, я получаю эту ошибку тайм-аута, если пытаюсь запустить команду после периода бездействия, вместо того, чтобы просто спросить Python, открыто ли мое соединение. Это ошибка, которую я получаю, если пытаюсь выполнить команду после бездействия:

 >>> # Establish a MySQL connection and do nothing for about 10 minutes.
>>> sql = "INSERT INTO Table (value_1, value_2) VALUES (%s, %s)"
>>> val = ('A', 'B')
>>> mycursor.execute(sql, val)
Traceback (most recent call last):
  File "C:UsersMyUsernameAppDataLocalProgramsPythonPython37libsite-packagespymysqlconnections.py", line 691, in _read_bytes
    data = self._rfile.read(num_bytes)
  File "C:UsersMyUsernameAppDataLocalProgramsPythonPython37libsocket.py", line 589, in readinto
    return self._sock.recv_into(b)
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    mycursor.execute(sql, val)
  File "C:UsersMyUsernameAppDataLocalProgramsPythonPython37libsite-packagespymysqlcursors.py", line 170, in execute
    result = self._query(query)
  File "C:UsersMyUsernameAppDataLocalProgramsPythonPython37libsite-packagespymysqlcursors.py", line 328, in _query
    conn.query(q)
  File "C:UsersMyUsernameAppDataLocalProgramsPythonPython37libsite-packagespymysqlconnections.py", line 517, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "C:UsersMyUsernameAppDataLocalProgramsPythonPython37libsite-packagespymysqlconnections.py", line 732, in _read_query_result
    result.read()
  File "C:UsersMyUsernameAppDataLocalProgramsPythonPython37libsite-packagespymysqlconnections.py", line 1075, in read
    first_packet = self.connection._read_packet()
  File "C:UsersMyUsernameAppDataLocalProgramsPythonPython37libsite-packagespymysqlconnections.py", line 657, in _read_packet
    packet_header = self._read_bytes(4)
  File "C:UsersMyUsernameAppDataLocalProgramsPythonPython37libsite-packagespymysqlconnections.py", line 699, in _read_bytes
    "Lost connection to MySQL server during query (%s)" % (e,))
pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query ([WinError 10054] An existing connection was forcibly closed by the remote host)')
  

Комментарии:

1. В любом случае, зачем вам нужно, чтобы база данных оставалась подключенной в течение одного сеанса простоя так долго? Я почти уверен, что если вы измените скрипт для выполнения случайных запросов, даже просто SELECT 1 или чего-то еще более безобидного, это останется в силе. (Если вам это действительно нужно.)

2. Я заполняю таблицу данными. Я хочу заполнить таблицу данными как можно быстрее, поэтому я не хочу накладных расходов на открытие нового соединения каждый раз. Данные будут поступать нерегулярно, поэтому я не хочу, чтобы между ними у моего соединения был тайм-аут, и я не хочу предварительно выполнять какое-либо действие, чтобы избежать тайм-аута. Я подумал, что было бы проще всего установить тайм-аут моего соединения на некоторое большое число… но это оказалось непросто.

3. Это не похоже на тайм-аут, сгенерированный базой данных. Похоже, что сеть разрывает незанятые соединения. Где выполняется код python? EC2? Внешний компьютер?

4. Я просто запускаю его на своем собственном компьютере дома. Стандартный 64-разрядный Python 3.7.2, стандартная Windows 10.

5. Вы могли бы просто проверить, установлено ли соединение, прежде чем выполнять запрос при поступлении этих новых данных. Поддерживать соединение может быть чрезвычайно сложно.

Ответ №1:

Я нашел решение. Я переключаюсь на PostgreSQL.

Комментарии:

1. если хост доступен, тайм-аут не влияет.

2. Не могли бы вы подробнее рассказать о том, что вы имеете в виду под этим?