0

5つのフェデレーションテーブルがあります。各テーブルは別のデータベースに接続されています。今、私はループでいくつかのことをします、そして私がループで最初にすることはフェデレーションテーブルでいくつかのことです。フェデレーションテーブルがリンクされているデータベースは常にオンラインであるとは限らないため、データベースがオフラインのときにエラーをキャッチするエラーハンドラーがあります。

残念ながら、データベースがオフラインの場合、クエリ(単純な選択クエリ)は、データベースがオンラインではないというエラーを返すまでに約5秒かかります。データベースがオンラインの場合、ループ内の残りのコードをスキップします。

今私の問題は、そのルーチンを5秒ごとに実行する必要があり、5秒で終了する必要があるということです。ただし、フェデレーションテーブルがリンクされているデータベースがオフラインの場合、データベースへの接続に失敗すると、次の時間がかかります。5 db*5秒=25秒

だから私の質問は、フェデレーションテーブルがリンクされているデータベースがオンラインであるかどうかをSQLで非常に高速にチェックすることは可能ですか?

4

2 に答える 2

1

から: 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 
于 2011-09-13T15:53:20.200 に答える
-1

これを試してください (SQL 2008)

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

state=6 はオフラインです

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

于 2011-09-13T15:35:15.060 に答える