大侠们都上班了没?请教一个问题。我们现在需要做一个系统来实时监控数据库,我目前的做法是用一个adoconnection组件与远程服务器的数据库建立连接,然后定时通过查询语句来查看数据库的变化。刚开始运行时没有问题,不过当系统运行的时间久了之后就会出现诸如adoconnection数据库连接方面的异常。请教大侠们,我这样设计有没有什么安全隐患,或者你们监控数据库一般是怎么来设计的?
   同时恭祝大家新年快乐!

解决方案 »

  1.   


    异常主要有下面几种:
    adoconnection连接异常,异常信息:对象打开时,不允许操作。
    [DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或拒绝访问。
    超时已过期
      

  2.   

    异常主要有下面几种:
    adoconnection连接异常,异常信息:对象打开时,不允许操作。
    [DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或拒绝访问。
    超时已过期以上情况一般是由于连接时,测试时间过长而至的,
    或者远程电脑没有开启或者在路由器中设置“映射”
      

  3.   

    你可以检查一下你的代码,第一个异常可能是由于sql的更新锁造成的,有人修改时不允许进行查询或者更改操作,
    解决方法是用try catch处理查询,用事物处理更新第二个异常sqlserver不存在或拒绝,你可以检查下sqlserver服务器状态,以及网络环境是否正常,如果都没问题,可能是因为链接超上限了,造成原因是多个客户端或者单个客户端不断的链接、断开造成的,要知道adoconnection 即使close也不是立即断开的这是系统本身的问题,我暂时不知道好的解决办法可以写个存储过程断开所有链接或不断尝试链接,直到sql释放空闲链接第三个问题如果是查询时间超过链接超时上限可以延长connection和查询控件的链接超时上限,另外检查sql是否设定了链接超时,我这里默认时间是600秒,不建议你修改这个时间,你可以采用异常捕捉来截获connection的异常,并在查询之前检查connection的状态,如果connection异常,重新链接就是了
    不要指望你可以创建一个adoconnection然后几个月不关掉它
      

  4.   

    如果是SQL数据库,可以考虑使用触发器+扩展存储过程来完成,既然是实时监测,你检查频率高了,对网络和数据库都是压力,如果是频率低了,又达不到实时的效果,因此让数据库发身变化的时候,自行通知你岂不是更好?
      

  5.   

    另外网上有一种说法free掉adoconnection可以彻底断开连接,不过这方法我没试过,而且身边没环境,不过就高频率查询来说,这方法不实际,高频率不断创建释放adoconnection,你的程序恐怕用不了多久就会崩溃了
      

  6.   

    其实我觉得6L的办法还是不错的,不要让服务器有太多的链接压力,而是把时时监控交给sql自己
      

  7.   

    真的要这样处理的话,有必要每次查询前重新连接一下,连不上就表示有问题了做另外的处理
    或者在open时,用try ... except end异常处理