Gerenciamento da Sessão NHiernate em Asp.Net
Autor:Eve Cole
Data da Última Atualização:2009-06-30 16:46:38
A sessão no NHibernate parece ser equivalente a uma conexão de banco de dados no meu entendimento. Por também possuir métodos Open/Close, não estudei o código fonte do NHibernate, será que esse entendimento está errado? Pesquisei muito sobre gerenciamento de sessões na Internet. A maioria deles é OpenSession() quando preciso de operações de banco de dados e CloseSession() após a operação. Isso é um pouco semelhante a quando começamos a aprender ADO.NET. ) o objeto Connection e, em seguida, Close() após o processamento dos dados. Mas isso traz uma desvantagem, porque a troca frequente de Connection consome recursos do sistema. Lembro-me de quando estava fazendo uma interface de entrada de dados antes, porque essa interface de entrada tinha muitos elementos de dados e muitos DropDownLists necessários para ler os dados no banco de dados e vinculá-los.
Desta forma, no Page_Load da página, os métodos dos objetos correspondentes precisam ser chamados um por um para recuperar a ligação de dados DropDownList do banco de dados. Como os métodos desses nossos objetos usam Conexões independentes, todos eles têm suas próprias. próprio Aberto e Fechado da Conexão. Portanto, demora muito para abrir esta página, que é relativamente lenta. Posteriormente, processamos os dados que precisavam ser vinculados ao DropDownList em um DataSet e vinculamos o DataTable no DataSet ao DropDownList. Desta forma, é necessário apenas um Aberto/Fechado de Conexão. A página é muito mais rápida.
Portanto, sinto que o método de gerenciamento de sessões acima não é muito apropriado.
Mais tarde, examinei seu gerenciamento de sessões no projeto de código aberto Cuyahoga e ele usou o modelo "sessão por solicitação".
O entendimento literal é que ele cria uma Sessão para cada Solicitação até que a solicitação seja destruída, então a Sessão é Fechada.
A abordagem de Cuyahoga é um pouco diferente da sessão por solicitação, pois ele cria um objeto CoreRepository para cada solicitação. CoreRepository é a classe de serviços de processamento de dados exigidos pelo sistema.
O que ele fez foi primeiro criar o HttpModule (NHSessionModule) para criar objetos CoreRepository e destruir objetos CoreRepository, como segue:
private void Context_BeginRequest(remetente do objeto, EventArgs e)
{
// Crie o repositório para objetos Core e adicione-o ao HttpContext atual.
CoreRepository cr = novo CoreRepository(true);
HttpContext.Current.Items.Add("CoreRepository", cr);
}
private void Context_EndRequest(objeto remetente, EventArgs e)
{
// Fecha a sessão do NHibernate.
if (HttpContext.Current.Items["CoreRepository"]!=nulo)
{
CoreRepository cr = (CoreRepository)HttpContext.Current.Items["CoreRepository"];
cr.CloseSession();
}
}
Desta forma, o objeto CoreRepository será criado automaticamente sempre que uma solicitação for feita. Quando a solicitação for concluída, CloseSession() pode ser usado para obter o objeto CoreRepository por meio de HttpContext.Current.Items["CoreRepository"] no programa.
Desta forma, a Sessão no NHibernate é gerenciada de forma disfarçada, e o modelo “sessão por solicitação” é alcançado.
Explicação detalhada: Inicialize a sessão do Nhibernate implementando IHttpModule
Comparado com o método acima, que requer a criação de uma Sessão para cada operação, este método deve melhorar muito o desempenho e a velocidade.
Então pensei, cada solicitação cria uma Sessão. Podemos também criar um Pool de Sessões como o Pool de Conexão?
Desta forma, em vez de criar uma Sessão diretamente toda vez que uma solicitação é feita, a Sessão já criada é retirada do nosso Pool de Sessões. Isso não é mais eficiente? !
http://maplye.cnblogs.com/archive/2006/06/26/435683.html