如何在没有连接的情况下检查数据库是up还是down?

时间:2015-10-28 06:17:45

标签: c# asp.net

我像这样使用oledbconnection:

try
{
    OleDbConnection Conn;
    using (Conn = new OleDbConnection("Provider=MSDAORA.1;Data Source=DATABASE1:1521/orcl;Persist Security Info=True;Password=PASSWORD;User ID=USERNAME"))
        {
            Conn.Open();
            v1 = 1;
            Conn.Close();
        }
}
catch (Exception)
{
    v1 = 0;
}

在面板上使用v1,如下所示:

if (v1 == 1)
{
    Panel1.BackColor = System.Drawing.Color.Yellow;
}
if (v1 == 0)
{
    Panel1.BackColor = System.Drawing.Color.Red;
}

这很简单,对我有用。当我打开此页面时,连接打开和关闭,面板颜色为黄色或红色。

但我想查看超过20个这样的数据库。当我打开这个页面时,20个连接打开,页面等待这么多。当然每次数据库连接打开。我可以使用outputcache,但我需要每隔30秒检查一次(我在这个页面上使用html refresh)。

我怎么能用其他方式呢?我可以使用tnsping吗?如果是,我如何使用tnsping数据库。

(Ping不允许在这台服务器上,我不想检查服务器是否启用,我想检查数据库是否启用)

3 个答案:

答案 0 :(得分:2)

您需要连接到数据库才能检查它是否已启动。 tnsping仅检查套接字是否可用。无法保证您尝试连接的数据库已启用。

恕我直言,您可以运行多个线程并并行连接。然后,您可以捕获正确的异常并获取正确的信息,以防数据库无法访问。

答案 1 :(得分:2)

  

我怎么能以其他方式做到这一点?

没有通用的方法来检查网络资源的可用性。可能有一些间接的方式(如ICMP,套接字可用性等),但它们什么都不保证。正确的方法是尝试连接资源(在您的情况下为数据库)。

  

但我想查看超过20个这样的数据库。当我打开这个   页面,20连接打开,页面等待太多了

看起来像是架构问题。

如果此页面类似于基础架构监控软件,我会编写一个常规(Windows)服务作为后端,它将定期并行提取数据库(使用async / await是这是IMO的最佳选择。

然后,Web前端应该提取此服务以获得结果。由于结果可以存储在本地数据库或内存中,因此响应时间会相当快(这取决于服务和Web应用程序的通信方式)。

答案 2 :(得分:2)

检查它的简单方法是连接数据库。如果服务器没有启动,那么它最终会抛出SqlException并且您可以检查异常对象的Error属性,该属性是sqlError对象的集合。