Не удается найти свободный дескриптор при использовании mysql через matlab

#mysql #matlab

#mysql #matlab

Вопрос:

Я получаю доступ к базе данных mysql через matlab в окне fedora13.

Проблема: я могу успешно открыть соединение, прочитать из таблиц и закрыть соединение с базой данных. Я могу повторить это для нескольких разных таблиц. Однако, через некоторое время (2-5 запросов) Я натыкаюсь на стену, и следующий вызов mysql open выдает исключение «Не удается найти свободный дескриптор». Единственный способ повторно подключиться к любой базе данных после этого — перезапустить matlab. Я проверил переменные в памяти (через whos) и проверил наличие процессов, запущенных в базе данных (показать processlist;), но не смог найти то, что блокирует мои попытки открыть соединения.

Глядя на mysql.cpp похоже, что значение MAXCONN может быть слишком низким, или мое закрытие mysql может обрабатываться некорректно, но я уже устранил эти возможности.

Я хотел бы иметь возможность открывать / закрывать соединения по мере необходимости моего приложения без необходимости перезапускать matlab между ними, чтобы освободить дескрипторы базы данных. Может ли кто-нибудь внести некоторую ясность в то, как работает этот процесс?

Ответ №1:

возможно, стоит подумать о написании функции, которая удерживает соединение и открывает новое соединение только тогда, когда старое отключено. Таким образом, вы можете использовать его повторно.

В общих чертах это выглядит

 function conn = hold_connection_a
persistent local_connection
try
  test_connection(local_connection);
catch
  local_connection=establish_connection;
end
conn = local_connection;
  

establish connection затем должна быть функция, которую вы используете для подключения и возврата вашего дескриптора. test_connection следует отправить простой запрос, подобный SELECT 1 , и выдать ошибку, если это не удается.

Кстати, если вы используете более одной базы данных, имело бы смысл либо иметь несколько из этих hold_connections, либо убедиться, что ваши инструкции всегда содержат имя базы данных.

Не связано: лично я использую mYm, так как нахожу его быстрее.

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

1. это компиляция mysql.cpp в matlab использование mex устраняет проблему.

Ответ №2:

Используйте close (conn), чтобы освободить соединение, созданное database (…), когда оно вам больше не нужно. Изменение MAXCONN на более высокое значение просто устранит симптом, а не причину.

Ответ №3:

Вы можете видеть связи с

 mysql
  

без параметров.

 mysql('close')
  

необходимо решить такую проблему.