2010-11-01 67 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