我正在尝试在Java中创建一个订购应用程序,用户下订单,指定产品。订单的时间戳和客户ID的组合是唯一的。我想要做的是每隔几秒(或几毫秒)检查新订单,获取新订单然后创建相应的对象。我有一个订单的ArrayList,其中每个Order都有一个ProductsList的ArrayList,一个时间戳和一个客户ID。 我每700毫秒向数据库发送一次查询,以便检索新订单并创建对象。
我的问题是,有时,查询不会返回新订单,即DB中的新条目。我尝试了几毫秒的各种值,但如果它变小,程序会创建两个甚至更多的Order对象。我希望每个新条目都有一个订单对象。
以下是代码:
DBConnect db = new DBConnect();
ScheduledExecutorService executorService =
Executors.newSingleThreadScheduledExecutor();
String today = new SimpleDateFormat("YYYY-MM-dd").format(new Date());
today = today + " 00:00:00";
ArrayList<Order> orders = new ArrayList<Order>();
db.connect();
executorService.scheduleAtFixedRate(new Runnable()
{
@Override
public void run()
{
String now = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date());
try
{
String query = "SELECT DISTINCT last_edit, customer_id, employee_username, closed\r\n" +
"FROM orders\r\n" +
"WHERE last_edit = '" + now + "' ORDER BY last_edit";
ResultSet rs = db.getStatement().executeQuery(query);
while(rs.next())
orders.add(new Order(rs.getString("last_edit"), rs.getString("customer_id"), rs.getString("employee_username"), rs.getString("closed")));
}
catch(Exception ex)
{
System.out.println(ex);
}
try
{
String query = "SELECT last_edit, product.id AS product_id,\r\n" +
"quantity_weight,\r\n" +
"orders.price\r\n" +
"FROM customer, product, orders\r\n" +
"WHERE orders.customer_id = customer.id\r\n" +
"AND orders.product_id = product.id\r\n" +
"AND last_edit = '" + now + "' ORDER BY last_edit";
ResultSet rs = db.getStatement().executeQuery(query);
for(Order order: orders)
{
while(rs.next())
if(order.getLast_edit().equals(rs.getString("last_edit")))
{
order.getProducts().add(new Product(rs.getString("product_id"), rs.getString("quantity_weight"), rs.getString("orders.price")));
System.out.println(order.getLast_edit());
}
rs.beforeFirst();
}
}
catch (Exception ex)
{
System.out.println(ex);
}
}
}, 0, 700, TimeUnit.MILLISECONDS);
答案 0 :(得分:0)
为什么你使用=
>=
SELECT (whatever) FROM (somewhere) WHERE order.id > lastSavedId
条件的平等对我来说是个谜。除此之外,您在系统时间戳上转发,该时间戳记录了最新最新订单的时间戳。在边缘情况下,多个订单可以具有相同的时间戳,这可能会给您带来麻烦。我假设您在表中自动增加了主键集,因此您应该依赖于id(您的pk),这保证是唯一的,保证时间戳。您的流程如下所示:
#include <iostream>
using namespace std;
int main()
{
int SomeNumber = 42;
std:string num = std::to_string(SomeNumber);
string padding = "";
while(padding.length()+num.length()<4){
padding += "0";
}
string result = "MyFile"+padding+num+".mp4";
cout << result << endl;
return 0;
}