java - 在 Java 中每 n 毫秒自动从 MySQL 数据库获取新条目

标签 java mysql

我正在尝试用 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),它保证是唯一的,而不是时间戳。您的流程将如下所示:

  1. 获取所有订单的列表 - 处理它们并从所选订单中获取最大 PK
  2. 从(某处)WHERE order.id > lastSavedId 中选择(无论什么)
  3. 处理新订单,保存最大 ID 并等待您想要的任何事情
  4. 转到 2。重复

关于java - 在 Java 中每 n 毫秒自动从 MySQL 数据库获取新条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49929256/

相关文章:

java - 在jetty上运行servlet时出现错误消息 "Server port In Use 8080-Http"

java - Ubuntu 中安装 Java8 失败 : Command Not Found/E: Sub-process/usr/bin/dpkg returned an error code (1)

java - Android 中的数据库访问 - 保存数据的最佳时机是什么

java - Objective-C : Serializing/Archiving issues

mysql - 使用 Unix TimeStamp 格式的数据计算每月行数的 SQL 查询

php - 尽管格式正确,MySQL 字段 DATETIME 仍被截断

带有 Tomcat 8.0.5 的 JavaMelody 1.52.0 - 未找到监控

php - 当我单击数据库表列表时,如何显示该表的属性?

mysql - 在 SELECT 查询中用 'foo' 替换列的空记录?

php - 对一个 mysql 列中的值求和并按其他列的值进行分组(使用 php foreach)