#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')
необходимо решить такую проблему.