如何连接(快速)检查联合表是否已连接?

时间:2011-09-13 15:28:10

标签: mysql sql database-connection federated-table

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

不幸的是,当数据库处于脱机状态时,查询(一个简单的选择查询)大约需要5秒才会返回数据库未联机的错误。如果数据库然后在线,我跳过循环中的其余代码。

现在我的问题是该例程需要每5秒执行一次,需要在5秒内完成。但是,当联合表连接到的数据库脱机时,连接到数据库的失败尝试将占用: 5分贝* 5秒= 25秒

所以我的问题是,如果联合表所链接的数据库在线,可以非常快速地检查SQL吗?

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:-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