2014-02-26 75 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并获取状态。 –