Gerenciando a contagem de produtos no banco de dados

underdog:

Com licença, se essa pergunta parecer ingênua, mas me deparei com um cenário em que preciso gerenciar a contagem de produtos no banco de dados de uma loja de comércio eletrônico.

Existe uma classe de produto com uma variável inteira productCountque significa o número de produtos disponíveis no banco de dados que é visível para os usuários do site. Agora, essa classe é acessada por vários threads ou pode-se dizer vários usuários do site de comércio eletrônico. Todo mundo está adicionando ou removendo o produto ao carrinho.

A estrutura ORM que está sendo usada é hibernada

Código de amostra

@Entity
@Table
class Product{
   @Column
   private int productCount;

   public void addProductToCart(){
     // decrements the product count by 1 & updates the database
   }

   public void removeTheProductFromTheCart(){
    // increments the product count by 1 & updates the database
   }

Como está claro no código, eu preciso manter uma verificação de simultaneidade na contagem de produtos no banco de dados para evitar atualizações perdidas.

Além disso, se vários usuários estiverem tentando adicionar apenas um produto esquerdo no banco de dados. De qual carrinho de usuário o produto deve ser adicionado?

Eu fiz uma pequena pesquisa sobre isso

As possíveis maneiras que encontrei foram

  1. Criando uma classe singleton para Product. Isso garantiria que apenas uma instância do produto estivesse disponível em todo o aplicativo.

  2. Sincronize os métodos addProductToCart& removeTheProductFromTheCart. o que permitiria que apenas um segmento atualizasse a contagem de produtos e atualizasse o banco de dados por vez.

  3. Use o controle de simultaneidade do banco de dados e aplique algum nível de isolamento de transação de banco de dados, bloqueio otimista / pessimista para o productCount. Estou usando o mysql, o nível de isolamento padrão é REPEATABLE_READ.

Qual seria a melhor abordagem para lidar com isso?

Nathan Hughes:

Nas duas primeiras possibilidades que você está considerando, elas funcionam apenas se você estiver restrito a implantar apenas uma única instância do aplicativo. Você não pode ter singletons gerenciados em várias instâncias de aplicativos, não pode ter sincronização em várias JVMs. Portanto, se você optar por uma dessas opções, as opções de implantação serão restritas, a única maneira de implantar várias instâncias do aplicativo é se você fizer algo como fixar as sessões em uma instância específica, o que é ruim para o balanceamento de carga. Então, esses dois parecem indesejáveis.

A abordagem de obter as contagens de produtos do banco de dados tem a vantagem de permanecer válida à medida que seu aplicativo é escalado em várias instâncias sem prejudicar o balanceamento de carga.

Você pode pensar que esta será apenas uma instância em um servidor, para que eu possa resolver isso. Mas, no momento em que você está construindo um aplicativo, pode não estar totalmente claro como o aplicativo será implantado (estive em situações em que não sabíamos qual era o plano até que o aplicativo foi configurado em um ambiente de pré-produção) ou posteriormente, pode haver um motivo para alterar a maneira como um aplicativo é implantado; se o seu aplicativo tiver uma carga acima do esperado, pode ser benéfico configurar uma segunda caixa.

Uma coisa que não é aparente para mim é o quão vital é que a contagem de produtos esteja realmente correta. Em diferentes domínios comerciais (passagens aéreas, remessas), é comum reservar em excesso e pode ser mais complicado do que vale a pena manter uma contagem 100% precisa, especialmente se estiver em um ponto inicial do processo, como adicionar um item às compras carrinho (comparado ao ponto em que o cliente realmente se compromete a fazer uma compra). No momento em que o cliente compra algo, pode fazer mais sentido garantir a reserva desses itens com uma transação de banco de dados (ou não, consulte overbooking novamente).

Parece comum em aplicativos da Web esperar uma baixa taxa de conversão de itens no carrinho para itens realmente comprados. Lembre-se de que nível de precisão para suas contagens é apropriado para o domínio da sua empresa.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Gerenciando um banco de dados SQL Azure

Como podemos recuperar a contagem de produtos do banco de dados usando vue js?

PHP - Gerenciando muitos dados sem banco de dados

WooCommerce: Localizando os produtos no banco de dados

Projeto de banco de dados: Gerenciando dados antigos e novos na tabela de banco de dados

Gerenciando chaves de criptografia com banco de dados

Flask, gerenciando conexões de banco de dados (sem ORM)

Banco de dados de comércio eletrônico SQL - obtendo contagem de produtos comprados por apenas um usuário

Gerenciando o conteúdo do banco de dados no servidor jhipster

Produtos de contagem SQL

Produtos de contagem SQL

Gerenciando o estoque de produtos no SQL Server

Contagem de PHP do banco de dados

Atualização de estoques de produtos no banco de dados

Contagem regressiva do banco de dados (data)

Contagem da tabela no banco de dados sql

entrada múltipla de produtos no banco de dados - PHP

Carregar categoria com produtos do banco de dados

Exibindo produtos curtidos do banco de dados laravel

Mongoose, não pode imprimir produtos do banco de dados

Como projetar um banco de dados para produtos médicos

excluindo produtos do banco de dados e recarregando no estoque

Recuperar dados de contagem do banco de dados Firebase

encontre a contagem de dados do banco de dados

Função de contagem de 2 tabelas no banco de dados

Contagem de referência de banco de dados

Gerenciando transações de banco de dados manualmente em um ambiente Spring / Hibernate

Gerenciando conexões de banco de dados em ASP.Net MVC

Banco de dados - Controle de versão - Gerenciando objetos descartados / excluídos

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    UITextView não está exibindo texto longo

  3. 3

    Dependência circular de diálogo personalizado

  4. 4

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  5. 5

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  6. 6

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  7. 7

    Setas rotuladas horizontais apontando para uma linha vertical

  8. 8

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  9. 9

    Definir um clipe em uma trama nascida no mar

  10. 10

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  11. 11

    Como dinamizar um Dataframe do pandas em Python?

  12. 12

    regex para destacar novos caracteres de linha no início e no fim

  13. 13

    Why isn't my C# .Net Core Rest API route finding my method?

  14. 14

    Como obter a entrada de trás de diálogo em treeview pyqt5 python 3

  15. 15

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  16. 16

    How to create dynamic navigation menu select from database using Codeigniter?

  17. 17

    Como recuperar parâmetros de entrada usando C #?

  18. 18

    Changing long, lat values of Polygon coordinates in python

  19. 19

    Livros sobre criptografia do muito básico ao muito avançado

  20. 20

    Método \ "POST \" não permitido no framework Django rest com ações extras & ModelViewset

  21. 21

    Pesquisa classificada, conte números abaixo do valor desejado

quentelabel

Arquivo