2014-02-26 110 views
0

我有這種情況。我將在服務器中觸發一個作業,一旦作業被觸發,一個條目將被寫入Execution_status_code爲1的作業表中。我需要等待一段時間,比如5分鐘,然後重新檢查Execution_status_code的值。只要值更改爲2,我需要進一步處理。在循環中執行SQL查詢

我正在使用現有連接連接到數據庫。我需要執行SQL,如果SQL輸出正在進行中,我需要等待一段時間,然後再執行語句。直到SQL輸出成功爲止,然後繼續等待。

下面是我試過的代碼。

Thread t = new Thread(); 
java.sql.Connection conn_javaComp = (java.sql.Connection)globalMap.get("conn_tNetezzaConnection_1"); 
java.sql.Statement st = null; 
java.sql.ResultSet rs = null; 
String check = null; 
String dbquery_javaComp = "select case when EXECUTION_STATUS_CODE = 2 then 'Success' when EXECUTION_STATUS_CODE = 1 then 'In progress' else 'Failure' end as EXECUTION_STATUS_CODE from JOB_BKUP_NCR where JOB_TYPE_CODE="+context.JobTypeCode+" and Load_id = (select max(load_id) from JOB_BKUP_NCR where job_type_code="+context.JobTypeCode+") and START_DATETIME = (select max(START_DATETIME) from JOB_BKUP_NCR where job_type_Code="+context.JobTypeCode+")"; 
try 
    { 
     do 
     { 
      st = conn_javaComp.createStatement(); 
      rs = st.executeQuery(dbquery_javaComp); 
      if(rs.next()) 
      { 
      check = rs.getString(1); 
      System.out.println(check); 
      if (check.equalsIgnoreCase("In Progress")) 
      { 
       t.sleep(1000); 
       System.out.println("thread executed1"); 
       System.out.println(dbquery_javaComp); 
       System.out.println(check); 
      } 
      } 
      else { 
      System.out.println(" No data found"); 
      } 
     }while (!"Success".equals(check)); 

    } 
catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     if(rs != null) 
      rs.close(); 
     if(st!= null) 
      st.close(); 
    } 
    catch (Exception e1) { 
     e1.printStackTrace(); 
    } 
} 

我得到的輸出是'進行中'。即使在更改數據庫中的值後,循環仍在進行中。我不確定我在做錯什麼。有什麼建議麼?

回答

2

您正在循環內創建新語句和新結果集,因此它們應該在循環內關閉。我在想,你的連接被多個語句和結果集損壞而沒有關閉它們。請嘗試關閉它們,看看是否有這項工作。

+1

它工作。非常感謝。 :) –

1

您將被緩存的數據是seeing

嘗試關閉並重新打開數據庫連接。如果您使用數據庫池,這可能甚至不夠好。

+0

它的工作。非常感謝。 :) –

0

有很多事情我可以預見你的代碼出錯了。因爲一旦大多數DBMS都會鎖定行,直到您提交/關閉連接,或者爲您提供數據的快照,因此您沒有看到更新值或應該更新它的事務不會通過。嘗試按循環迭代來關閉或重新打開事務。

我也懷疑這是否是一種很好的代碼設計,因爲您正在進行「輪詢」。考慮是否可以找到其他獲得該事件通知的方法。

+0

它的工作。非常感謝。 :) –

0
try 
{ 
//declare here your statement and resultset 
    st = conn_javaComp.createStatement(); 
    rs = st.executeQuery(dbquery_javaComp); 
    do 
    { 
     if(rs.next()) 
     { 
     check = rs.getString(1); 
     System.out.println(check); 
     if (check.equalsIgnoreCase("In Progress")) 
     { 
      t.sleep(1000); 
      System.out.println("thread executed1"); 
      System.out.println(dbquery_javaComp); 
      System.out.println(check); 
     } 
     } 
     else { 
     System.out.println(" No data found"); 
     } 
    }while (!"Success".equals(check)); 
+0

我需要在循環中執行sql並獲取狀態。 –