0

我有 5 个联合表。每个表都连接到另一个数据库。现在我在一个循环中做一些事情,我在循环中做的第一件事是一些与联合表有关的事情。因为联合表链接到的数据库并不总是在线,所以我有一个错误处理程序,它在数据库离线时捕获错误。

不幸的是,当数据库离线时,查询(一个简单的选择查询)大约需要 5 秒才能返回数据库不在线的错误。如果数据库在线,我将跳过循环中的其余代码。

现在我的问题是该例程需要每 5 秒执行一次,并且需要在 5 秒内完成。但是,当联合表链接到的数据库处于脱机状态时,连接到数据库的失败尝试占用:5 db * 5 sec = 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 回答