Como usar o db4o iobjectContainer em um aplicativo da web? (Lifetime de contêiner?)
-
21-09-2019 - |
Pergunta
Estou avaliando o DB4O para persistência para um projeto ASP .NET MVC.
Estou me perguntando como devo usar o iObjectContainer em um contexto da web em relação à vida útil do objeto. Eu vejo, posso fazer um dos seguintes:
- Crie o IObjectContainer na inicialização do aplicativo e mantenha a mesma instância durante toda a vida útil do aplicativo.
- Crie um iObjectContainer por solicitação.
- Inicie um servidor e obtenha um IObjectContainer do cliente para cada interação do banco de dados.
Quais são as implicações dessas opções, em termos de desempenho e simultaneidade?
Como o banco de dados está bloqueado quando um IObjectContainer é aberto, tenho certeza de que a opção 2) me daria alguns problemas com a simultaneidade - esse também seria o caso da opção 1?
Pelo que entendi, se eu recuperar um objeto de um IObjectContainer, ele deve ser salvo pela mesma instância do IObjectContainer - para que o DB4O o identifique como sendo o mesmo objeto. Portanto, se eu escolher a opção 3), teria que recuperar o objeto original, fazer as alterações necessárias (copiar dados de um objeto modificado) e armazená -lo usando o mesmo iObjectContainer. Isso é verdade ?
Solução
Opção 1) pode causar problemas sérios, pois você compartilhará efetivamente uma transação entre todas as solicitações. Eu não acho que essa seja uma opção viável.
Como você já identificou, a opção 3) está repleta de perigos, porque você terá que acompanhar a identidade do objeto manualmente - uma tarefa tediosa e extremamente propensa a erros. Isso realmente destrói toda a beleza do banco de dados de objetos. Além disso, pelo que sei a sobrecarga de criar IObjectContainer
não é pequeno, então isso será muito caro.
Isso nos deixa praticamente com a opção 2, que não bloqueia o banco de dados quando aberto no modo cliente -servidor, tanto quanto eu sei - onde você encontrou essa informação? Portanto, a melhor idéia é abrir um IObjectServer
na inicialização do aplicativo e abrir um novo IObjectContainer
por solicitação ou conecte-se a um servidor remoto usando o TCP por solicitação.