gpt4 book ai didi

java - 如何进行轮询并定期检查数据库中的新传入数据

转载 作者:搜寻专家 更新时间:2023-11-01 03:09:06 25 4
gpt4 key购买 nike

这里的方法读取具有唯一 ID 的数据库,序列号不断增加,因为我是 java 的初学者,我能知道如何实现这种重复轮询并每次检查是否有新的传入消息。

/**
* Method which defines polling of the database and also count the number of Queries
* @return pojo collection
* @throws Exception
*/
public List<KAMessage> fullPoll() throws Exception {
Statement st = dbConnection.createStatement();
ResultSet rs = st.executeQuery("select * from msg_new_to_bde where ACTION = 804 order by SEQ DESC");
List<KAMessage> pojoCol = new ArrayList<KAMessage>();
while (rs.next()) {
KAMessage filedClass = convertRecordsetToPojo(rs);
pojoCol.add(filedClass);
}

return pojoCol;
}


/**
* Converts a provided record-set to a {@link KAMessage}.
*
* The following attributes are copied from record-set to pojo:
*
* <ul>
* <li>SEQ</li>
* <li>TABLENAME</li>
* <li>ENTRYTIME</li>
* <li>STATUS</li>
* </ul>
*
* @param rs
* @return the converted pojo class object
* @throws SQLException
*
*/
private KAMessage convertRecordsetToPojo(ResultSet rs) throws SQLException {

KAMessage msg = new KAMessage();
int sequence = rs.getInt("SEQ");
msg.setSequence(sequence);
int action = rs.getInt("ACTION");
msg.setAction(action);
String tablename = rs.getString("TABLENAME");
msg.setTableName(tablename);
Timestamp entrytime = rs.getTimestamp("ENTRYTIME");
Date entryTime = new Date(entrytime.getTime());
msg.setEntryTime(entryTime);
Timestamp processingtime = rs.getTimestamp("PROCESSINGTIME");
if (processingtime != null) {
Date processingTime = new Date(processingtime.getTime());
msg.setProcessingTime(processingTime);
}
String keyInfo1 = rs.getString("KEYINFO1");
msg.setKeyInfo1(keyInfo1);
String keyInfo2 = rs.getString("KEYINFO2");
msg.setKeyInfo2(keyInfo2);
return msg;
}
}

这是我试过的:

       while(true){
try {

incomingMessages.addAll(fullPoll());
System.out.println("waiting 6 seconds");
//perform this operation in a loop
Thread.sleep(6000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

如何使用准备好的语句将参数传递到此代码的查询中我卡在了这里..

public List<KAMessage> fullPoll() throws Exception {
PreparedStatement oldSeq = null;
PreparedStatement newSeq = null;
Statement st = dbConnection.createStatement();
System.out.println("Polling");
String query = "select * from msg_new_to_bde where ACTION = 804 and SEQ between oldSeq and newSeq order by SEQ DESC";// insert in table
pstmt = conn.prepareStatement(query);
}

最佳答案

可以有多种方式来实现重复轮询,我能想到的最简单的方式是将轮询方法放在一段时间内,例如thread.sleep:

    while(true){
fullPoll();
Thread.sleep(10000);
}

不要忘记使用 try catch,因为您抛出了异常。或者,您可以使用诸如计时器任务或框架之类的东西作为 quartz 。

为了检查数据库中是否有新数据,我可以想到以下方法(可以有更优化的):

您可以对行进行计数,以便了解是否已添加其他行,以便您可以重新运行查询。

这不包括行被删除和重新插入的情况,为了也包括这一点,您可以尝试将上次查询数据库时使用的最大 ID 存储在某个地方,并每次检查新的最大 ID 是否与你记住的最后一个,如果是,数据库已经改变。

例如,如果您将旧索引保存在变量 oldSeq 中,将新索引保存在变量 newSeq 中,并且您只想获取新添加的消息,则可以使用如下查询:

select * from msg_new_to_bde where ACTION = 804 and SEQ between oldSeq and newSeq order by SEQ DESC

您应该检查您的数据库之间是否还包括测试值(oldSeq 和 newSeq)

关于java - 如何进行轮询并定期检查数据库中的新传入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14213099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com