当前位置: 首页 > 知识库问答 >
问题:

如何用数据库实现完美队列

裴浩歌
2023-03-14

我正在设计一个购物车,
我的购物车里有X产品。每个产品都与一个商店相关联。

  • 示例产品1由Shop1销售
  1. 我以XML的形式获取产品1的详细信息(Shop1中的可用性和价格[当产品售出或价格发生变化时])

这应该如何处理?

我将项目分为两个部分:

1:项目1

我创建了一个基于表单的应用程序,所有商店都使用它
销售产品时,商店管理员将输入产品详细信息(可用单元数…等)并提交。我将其转换为XML并保存到表1中。

示例:
表1

Product_ID  | XML 
--------------------------------
Prod_1A     | xml  
Prod_2A     | xml  
Prod_3A     | xml  
Prod_1A     | xml  

2: 项目2

在这个项目中,我使用

ServletContextListener

当我部署这个项目时,在ServletContextListener contextLaunated方法
的帮助下,我正在创建一个Timer,它将每10秒运行一次。在那个Timer中,我正在检查Table1是否包含任何记录。如果是,在Timer类的run方法中,我正在从中挑选1条记录并更新我的购物车中的数据。

for (int i = 0; i <= 5 ; i++) {

    fetchFromNotif = fetchFromNotif(); // this methods picks a unique record
    if (fetchFromNotif != null) {
        new Thread()
        {
            public void run()
            {
                // updating the data in my Shopping cart DB.
            }
        };
        t.start();
    }
}

我的问题是,这是否是每10秒使用计时器并创建多个线程的正确方法?是否有更好的方法来实现这些要求。

对于这种类型的场景,是否有更好的方法来实现队列机制?

共有3个答案

伏星汉
2023-03-14

我清楚地了解到,您需要从项目#2轮询项目#1模块数据库,以获取产品更新并更改数据库#2中的购物卡数据。

在项目#2中,您可以实现ScheduledExecutorService,并在其中进行获取和更新,无需详细说明:

public class MyAppServletContextListener 
           implements ServletContextListener {
. . .
    @Override
    public void contextInitialized(ServletContextEvent e) {
        //Schedule cart updater

        Executors.newSingleThreadScheduledExecutor()
            .schedule(new Runnable() {
                @Override
                public void run() {
                    ProductUpdate productUpdate = fetchProductUpdate();

                    //do some additional stuff with productUpdate, some checks or logging

                    updateShoppingCart(shoppingCart, productUpdate);
                }
            }, 10, TimeUnit.SECONDS);
    }

}

但实际上,如果不强烈要求将产品更新逻辑与购物车更新分开,我建议在商店更新产品后立即更新项目#1中的所有购物车数据。然后您不需要任何计时器,因为您已经处于产品更新上下文中,您可以准确地看到更新了哪个产品以及更改了哪些数据。

public void processProductUpdateForm(ProductUpdate upd) {
    updateProductInDatabase(upd);


    updateAssociatedShoppingCarts(upd);

}
董权
2023-03-14

您还可以确定购物车中何时需要此更新的产品信息,并拉取信息而不是推送信息。也许你不需要实时更新它?

也许你可以检查一下,只有当用户去结账时,产品库存或价格是否有任何更新?或者在你确定的其他点上。。。

这样您就可以简化事情,而不用担心线程或队列。

司马昕
2023-03-14

您可以为此使用JMS。

-您将在html" target="_blank">服务器上运行JMS服务(可以是部署project 2的同一服务器)

-项目1-将向队列添加XML

-Project 2-将从队列中读取。

使用JMS,您不必实现自己的计时器/侦听器。项目1将获得到队列的连接,并将消息添加到队列。JMS客户端将实现MessageListener。每当项目1将消息添加到队列时,都会调用项目2中的MessageListener#onMessage。

对于创建队列,您可以使用Apache的ActiveMQ。

还要检查:how-can-i-use-textmessage-to-send-an-xml-file-to-jms-queue

编辑:正如“Amrola”所指出的,使用MDB(消息驱动Bean)比使用Message Listener更好。使用MDB将为您提供ejb容器提供的服务。

 类似资料:
  • 队列简介 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 在队列的形成过程中,可以利用线性链表的原理,来生成一个队列。基于链表的队列,要动态创建和删除节点,效率较低,但是可以动态增长。队列采用的 FIFO

  • 本文向大家介绍如何利用FluentMigrator实现数据库迁移,包括了如何利用FluentMigrator实现数据库迁移的使用技巧和注意事项,需要的朋友参考一下 FluentMigrator Fluent Migrator是一个基于.NET的迁移框架,你可以像使用Ruby on Rails Migrations一样使用它。Fluent Migrator的最新版本是3.13版,官网地址https:

  • 我很困惑为什么我的队列不工作,我相信排队和退队方法中存在问题。但是我不确定,我应该实现初始数组大小设置为8的类。一旦元素数量超过该大小,数组大小将加倍。从数组开头移除元素后,需要将数组中的所有元素向左移动一个位置。编写一个测试程序,将从1到20的20个数字添加到队列中,然后删除这些数字并显示它们。这是我的密码 这里是测试类。

  • 本文向大家介绍批处理完美实现FTP远程备份数据,包括了批处理完美实现FTP远程备份数据的使用技巧和注意事项,需要的朋友参考一下 经过再次努力,终于完成了自己的比较满意的版本,大家多批评…… 批处理功能:           输入几个参数,让批处理代你完成烦琐的工作吧!远程FTP文件到本地计算机,你可以拖入开机启动或任务计划中,定时下载远程的指定数据,希望大家多测试,多提意见,多完善,谢谢!上代码!

  • 我想创建一个食谱网站,在那里你可以添加/修改/删除食谱,每个模型都应该有一个配料的列表,与所需的量的那个配料。 我试图使用这样的dict:,但结果是EF Core并不真正喜欢dicts的思想,所以我试图创建一个“映射器”模型,如下所示: 问题是,它仍然没有真正起作用。我不能添加菜谱,也不能删除,因为它进入了一个永远循环。 你将如何实施它? 谢谢

  • 简介 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (largest-in,first-out)的行为特征。 优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有: 查找; 插入一个新元素; 删除。 在最小优先队列(min priority qu