Как проверить (быстро), если объединенная таблица подключена? - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть 5 федеративных таблиц.Каждая таблица связана с другой базой данных.Теперь я делаю некоторые вещи в цикле, и первое, что я делаю в цикле, это некоторые вещи с объединенной таблицей.Поскольку база данных, с которой связана федеративная таблица, не всегда подключена, у меня есть обработчик ошибок, который перехватывает ошибку, когда база данных отключена.

К сожалению, когда база данных находится в автономном режиме, запрос (простой запрос выбора) занимает около 5 секунд, прежде чем он выдаст ошибку, что база данных не подключена.Если база данных подключена, я пропускаю остаток кода в цикле.

Теперь моя проблема в том, что эту процедуру нужно выполнять каждые 5 секунд и завершать за 5 секунд.Однако, когда базы данных находятся в автономном режиме, с которыми связана федеративная таблица, тогда неудачные попытки подключения к базе данных занимают: 5 дБ * 5 сек = 25 секунд

Так что мой вопрос можно проверить очень быстров SQL, если база данных, с которой связана федеративная таблица, подключена?

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

От: http://onlamp.com/pub/a/databases/2006/08/10/mysql-federated-tables.html?page=3

Проверка подключения федеративной таблицы

Поскольку объединенные таблицы строго зависят от активных соединений, перед использованием таблицы рекомендуется проверить, достижимы ли данные. Вот функция, которая делает это, пытаясь запросить информационную схему о объединенной таблице и немедленно проверить, перехватила ли она SQLSTATE 'HY000'.

CREATE FUNCTION fed_table_available( 
    p_table_schema varchar(50), 
    p_table_name varchar(50) )
RETURNS BOOLEAN
BEGIN
    DECLARE connection_dead BOOLEAN DEFAULT FALSE;
    DECLARE how_many int;
    DECLARE curx CURSOR FOR
        SELECT COUNT(*)
        FROM information_schema.TABLES
        WHERE
            TABLE_SCHEMA = p_table_schema
            AND TABLE_NAME = p_table_name;
    DECLARE CONTINUE HANDLER FOR SQLSTATE 'HY000'
        SET connection_dead = TRUE;
    OPEN curx;
    IF connection_dead THEN
        RETURN FALSE;
    ELSE
        FETCH curx into how_many;
        CLOSE curx;
        RETURN (how_many > 0);
    END IF;
END 
0 голосов
/ 13 сентября 2011

Попробуйте это (SQL 2008)

select * from sys.databases where state=6 and name in ('DB1','DB2', etc...)

состояние = 6 не в сети

http://msdn.microsoft.com/en-us/library/ms178534.aspx

...