2010-11-01 68 views
1

我有一个windows服务,以给定的时间间隔轮询Oracle数据库,并根据某些标准更新几个字段。要做到这一点,它会打开一个光标并遍历行来更新。Windows服务数据库更新

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秒才能迭代,会发生什么情况?我意识到每个计时器都可以在单独的线程中工作,但是如果每次都建立一个新的数据库连接,第二次调用是否会查看第一次调用所做的更改?

回答

1

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

所做的假设是一个提交在您的过程中执行。如果您在每次更新后执行提交,则所有投注均关闭。您的第二个进程将会看到第一个(但不是全部)执行的一些更新 - 只有在第二个进程中打开游标时执行的更新。

0

如果您惊吓光标需要超过20秒,您可以在进程之前停止计时器,然后在进程完成后重新启动计时器。在进程之前可以停止计时器吗?

+0

我想是这样,但我的问题更多:“会发生什么?”而不是“我怎样才能解决它?” – 2010-11-01 09:38:54

+0

对不起,我想念明白:) – 2010-11-01 09:39:31