我正在尝试用 Java 创建一个订购应用程序,用户可以在其中下订单并指定产品。订单时间戳和客户 ID 的组合是唯一的。我想做的是每隔几秒(或毫秒)检查一次新订单,获取新订单,然后创建相应的对象。我有一个订单数组列表,其中每个订单都有一个产品数组列表、时间戳和客户 ID。 我每 700 毫秒向数据库发送一次查询,以便检索新订单并创建对象。
我的问题是,有时查询不会返回新订单,即数据库中的新条目。我尝试了不同的毫秒值,但如果它太小,程序会创建两个甚至更多的 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);
最佳答案
为什么你使用相等 =
而不是 >=
条件对我来说是个谜。除此之外,您依赖系统时间戳而不是最后一个最新订单的时间戳。在边缘情况下,多个订单可能具有相同的时间戳,这可能会给您带来麻烦。我假设你已经在表中设置了自动增量主键,所以你应该依赖 id (你的 pk),它保证是唯一的,而不是时间戳。您的流程将如下所示:
- 获取所有订单的列表 - 处理它们并从所选订单中获取最大 PK
从(某处)WHERE order.id > lastSavedId 中选择(无论什么)
- 处理新订单,保存最大 ID 并等待您想要的任何事情
- 转到 2。重复
关于java - 在 Java 中每 n 毫秒自动从 MySQL 数据库获取新条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49929256/