none
singleton para gerenciamento de conexão e transação RRS feed

  • Pergunta

  • Olá,

    Desculpem se minha pergunta for besta, mas estou com essa pulga atrás da orelha.

     

    A princípio não estou utilizando APPBLOCKS.

     

    Desenvolvi algumas aplicações em C# windows forms em que utilizei o padrão sigleton para gerenciar conexões e transações. Funcionou muito bem, ai ao iniciar um projeto web (asp.net e c#) me surge a seguinte duvida:

     

    Será que se eu implementar este padrão para gerenciar minhas transações e conexões em um projeto web eu terei problemas como por exemplo:

     

    Usuário acessa página principal seleciona um dos itens do menu utilizando a opção de abrir a página em NOVA JANELA.

    Neste momento o usuário tem 2 janelas do IE abertas JANELA 1 e JANELA 2.

     

    O usuário na JANELA 2 clica em um botão que [ abre conexao BEGIN TRAN -   INSERT UPDATE UPDATE INSERT - COMMIT fecha conexão ]

    porém devido a um motivo qualquer vamos supor que esteja muito lento e enquanto o processamento é efetuado na JANELA2  o usuário resolve ir para aJANELA 1 e clicar em um link que [abre conexão - BEGIN TRAN INSERT UPDATE COMMIT ]

     

    PORTANTO podemos notar que o usuário está executando as 2 tarefas ao mesmo tempo em uma arquitetura singleton para gerenciamento de conexões e transações.

     

    Ao executar a rotina da JANELA 2, no momento que estava lento, se o usuário resolveu executar a rotina da JANELA 1 enquanto a rotina da JANELA 2 estava sendo processada, poderia acontecer da rotina da JANELA 1 ser processada mais rápido COMMITANDO A TRANSAÇÃO e FECHANDO A CONEXÃO derrubando o processamento da JANELA 2 e ainda ter COMMITADO parte do que foi processado na rotina da JANELA 2 já que estamos utilizando singleton para gerenciar transações e conexões??[

     

    Será que para web é uma boa saída utilizar singleton para gerenciar conexões e transações?

     

     

    sexta-feira, 20 de junho de 2008 03:36

Respostas

Todas as Respostas

  • Alexandre,

    antes de tudo, qual é seu objetivo ao utilizar Singleton para gerenciar conexões e transações?

     

     

    segunda-feira, 23 de junho de 2008 17:01
  • exatamente, usar singleton para o gerenciamento de conexões e transações.

     

    segunda-feira, 23 de junho de 2008 18:01
  • Sim, entendi, mas com qual objetivo? Pq gerenciar com singleton e não gerenciar sem singleton? Qual é o problema que vc está tentando resolver ou minimizar?

     

    segunda-feira, 23 de junho de 2008 18:57
  • Garantir que irá existir somente uma conexão aberta por sessão

    só eu tiver 2 browsers abertos entro nesse empasse. Utilizando sigleton ao dar um close na conexão da janela 1 se eu estiver no meio de um processamento na janela 2 será que ocorre algum problema?

     

    Pelo que andei lendo o Data Access Application Blocks utiliza singleton para controlar transações e conexões, mas ainda não tive tempo para fazer um teste com o appblock.

     

    segunda-feira, 23 de junho de 2008 19:05
  • Alexandre,

    deverá existir um cuidado extra ao utilizar singleton para recursos não gerenciados em ambiente web. Ao utilizar este padrão, todas as threads existentes irão utilizar um mesmo objeto de conexão (assim como seu exemplo). Por estar acessando um recurso não gerenciado fora do escopo da aplicação, se este objeto de conexão não responder um thread, todas as outras que requisitar este objeto entrarão em deadlock, o que pode virar um caos no seu sistema.

    Para esta situação você pode fazer duas coisas:

    1. Criar um mecanismo complexo de controle de concorrência e deadlock no seu objeto;
    2. Abrir a conexão o mais tarde possível e fechá-la o mais rápido possível.

    Pelo que eu me lembre, o AppBlock não utilza Singleton. Na verdade ele cria a conexão sempre que necessário e fecha assim que possível.

     

    One of the most common tasks developers must consider is how to manage connections to the database. Whenever possible, the application block handles connection management. An application block method opens a connection and closes it prior to returning. This reduces both the amount of client code required and the possibility of leaving connections open.

    In the case of the ExecuteDataReader method, the DataReader object is executed using the CommandBehavior.CloseConnection method. This automatically closes the connections when the DataReader is closed.

     

    Concluindo,

    se você efetuar testes com Singleton e No-Singleton irá notar que não existe ganhos de performance, assim como não utilizar singleton, em certas perspectivas, garantem um melhor funcionamento neste caso para ambientes web.

     

    Portanto, respondendo a sua pergunta, na minha opinião não compensa utilizar este cenário de Singleton.

     

    Abraços.

    segunda-feira, 23 de junho de 2008 19:50
  • valeu cara..

    era essa minha dúvida...

     

    segunda-feira, 23 de junho de 2008 20:21