代码之家  ›  专栏  ›  技术社区  ›  Paul Michaels

Windows服务数据库更新

  •  1
  • Paul Michaels  · 技术社区  · 15 年前

    我有一个Windows服务,它按给定的时间间隔轮询Oracle数据库,并根据某些条件更新几个字段。为此,它打开一个光标,并循环访问要更新的行。

    protected override void OnStart(string[] args)
    {      
        TimerCallback timerDelegate = new TimerCallback(DoStuff);
        serviceTimer = new Timer(timerDelegate, null, 0, 20000);
    }
    
    private void DoStuff(object state)
    {
        // Set-up connectionsString and sqlQuery
    
        using (OracleConnection oraConnect = new OracleConnection(connectionString))
        {
            oraConnect.Open();
    
            using (OracleCommand oraCommand = new OracleCommand(sqlQuery, oraConnect))
            using (OracleDataReader oraReader = oraCommand.ExecuteReader())
            {
                while (oraReader.Read())
                {
                      // Do some processing here – may take some time
    
                      // Update database here
                }
            }
    }
    

    我的问题是,比如说,计时器的间隔是20秒(如上所述)。如果光标需要30秒来迭代会发生什么?我知道每个计时器将在一个单独的线程中工作,但是考虑到每次都建立一个新的数据库连接,第二个调用会看到第一个调用所做的更改吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   DCookie    15 年前

    第二个进程将只看到第一个进程提交的更改。如果第二个进程在第一个提交之前启动,那么它将看不到第一个进程所做的更改。

    假设在您的流程中执行一次提交。如果在每次更新后执行提交,则所有赌注都将关闭。第二个进程将看到第一个进程执行的某些更新,但不是全部更新——只有在第二个进程中打开光标时提交的更新。

        2
  •  0
  •   Serkan Hekimoglu    15 年前

    如果您担心光标需要20秒以上,可以在进程前停止计时器,然后在进程完成后重新启动计时器。是否可以在进程前停止计时器?