zoukankan      html  css  js  c++  java
  • 让服务不再停止(在Windows Service中使用Timer的技巧)

    平时在开发中,经常遇到的一个需求就是,要开发一个后台的程序,来监视数据库中某些数据的变化,并且发生变化以后要立刻做出响应。

    实际上呢,我们会建立一个Windows Service工程,在里面放一个Timer组件,然后定时的连接数据库,判断,然后进行操作。

    这两天做了一个这样的小程序,可是每隔几天就会发现服务不知道在什么时候,莫名其妙的停掉了,查找程序,没有发现什么错误。于是找日志,发现那个时间数据库服务器更新了程序,自动重新启动了。因为我的Windows Service每隔1秒钟连接一次数据库,所以肯定会碰到SqlException异常,自然就Down掉了。

    确定了问题的原因,解决的思路也就清晰了。数据库正常的情况下,每隔1秒钟连接一次数据库,一旦发现数据库连接不上,则变为5分钟甚至更长的时间连接一次数据库,直到数据库可以正常使用,再修改间隔为1秒钟。最主要的,无论数据库发生什么情况,Timer组件的事件应该是不能中断的。

    具体实现呢,有这么几点需要注意的吧:
    1、从工具箱拖到窗口的Timer,实际上是System.Windows.Forms.Timer,这家伙在Windows Service下是不触发事件的,需要到扩展名为designer.cs的文件中,修改为System.Timers.Timer。
    2、在控件的属性中或者直接在服务的OnStart事件中,设置Timer的Enable为True,Interval为需要轮循数据库的值,这个单位是毫秒。
    3、接下来就是Timer的事件了,参照下面这段代码就OK了。

    private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        timer1.Enabled 
    = false;

        
    try
        {
            
    // 在这里对数据库进行操作

            timer1.Interval 
    = 1 * 1000;
        }
        
    catch (SqlException sqlException)
        {
            timer1.Interval 
    = 5 * 60 * 1000;
        }
        
    finally
        {
            timer1.Enabled 
    = true;
        }
    }

    需要注意的是,抛出异常也是需要时间的,所以这个示例虽然设置了5分钟,但是实际上轮循的时间会略大于5分钟。

    上面只是对数据库的异常进行了处理,其实可以触类旁通的,如果Windows Service用于其他目的,对于其他一些有可能暂时中断,但以后会恢复的情况,都可以采用类似的方法处理。比如说网络中断之类的吧。
  • 相关阅读:
    Mac环境下,终端命令行开启、关闭和重启mysql数据库
    Java连接Mysql数据库详细代码
    强制关闭MySQL数据库
    ssh登录服务器出现Permission denied (publickey,gssapi-keyex,gssapi-with-mic)警告
    JSP中“转发”和“重定向”的区别
    Mac环境下配置Tomcat服务器
    TCP和UDP的区别
    div宽高未知,设置小的div位于大的div的中心
    HTML:使用Jquery动态生成二级选项列表
    $(document).ready()和window.onload的区别
  • 原文地址:https://www.cnblogs.com/bingyun84/p/1735326.html
Copyright © 2011-2022 走看看