每隔n毫秒用Java自动从MySQL数据库中获取新条目

时间:2018-04-19 19:57:58

标签: java mysql

我正在尝试在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);

1 个答案:

答案 0 :(得分:0)

为什么你使用= >= SELECT (whatever) FROM (somewhere) WHERE order.id > lastSavedId条件的平等对我来说是个谜。除此之外,您在系统时间戳上转发,该时间戳记录了最新最新订单的时间戳。在边缘情况下,多个订单可以具有相同的时间戳,这可能会给您带来麻烦。我假设您在表中自动增加了主键集,因此您应该依赖于id(您的pk),这保证是唯一的,保证时间戳。您的流程如下所示:

  1. 获取所有订单的清单 - 处理它们并从所选订单中获取最大PK
  2. #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; }
  3. 处理新订单,保存最大ID并等待您想要的任何内容
  4. 转到2. repeat