Не могу найти свободный дескриптор при использовании MySQL через Matlab - PullRequest
1 голос
/ 08 ноября 2011

Я обращаюсь к базе данных mysql через matlab на коробке fedora13.

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

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

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

Ответы [ 3 ]

2 голосов
/ 08 ноября 2011

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

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

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, либо убедиться, что ваши операторы всегда содержат имя базы данных.

Unrelated: лично я использую мм , так как я нахожу это быстрее.

1 голос
/ 08 ноября 2011

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

0 голосов
/ 20 января 2013

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

mysql

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

mysql('close')

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...