Evite o uso do recurso Identity do SQLServer quando utilizar NHibernate

Hoje Tuna Toksoz fez um post interessante no site do NHibernate. Ele explica porque evitar o uso do Identity. Vou resumir o post aqui.

Basicamente quando se usa o Identiy, o recurso de batching do NHibernate fica impossibilitado de ser aplicado. Ele mostra isso utilizando os seguintes códigos:

   1:  [Test]
   2:  public void Should_not_insert_entity_in_a_transaction_HiLo()
   3:  {
   4:      var post = new PostWithHiLo {Title = "Identity Generators Revealed"};
   5:      var postComment = new PostCommentWithHiLo { Post = post, Comment = "Comment" };
   6:      using (ISession session = factory.OpenSession())
   7:      using (var tran = session.BeginTransaction())
   8:      {
   9:          session.Save(post); //No commit here
  10:          session.Save(postComment);
  11:          long insertCount = factory.Statistics.EntityInsertCount;
  12:          Assert.That(insertCount, Is.EqualTo(0), "Shouldn't insert entity in a transaction before commit.");
  13:      }
  14:  }
  15:   
  16:  [Test]
  17:  public void Should_not_insert_entity_in_a_transaction_Identity()
  18:  {
  19:      var post = new PostWithIdentity {Title = "Identity Generators Revealed"};
  20:      var postComment = new PostCommentWithIdentity {Post = post, Comment = "Comment"};
  21:      using (ISession session = factory.OpenSession())
  22:      using (var tran = session.BeginTransaction())
  23:      {
  24:          session.Save(post);
  25:          session.Save(postComment);
  26:          long insertCount = factory.Statistics.EntityInsertCount;
  27:          Assert.That(insertCount, Is.EqualTo(0), "Shouldn't insert entity in a transaction before commit.");
  28:      }
  29:  }

No primeiro teste, que não utiliza Identity, nada é enviado para o banco. Já no segundo teremos 2 comandos INSERT enviados ao banco.  Isso significa que podemos enfrentar problemas de performance, já que o banco será acessado várias vezes.

Pra finalizar ele mostra um último exemplo:

   1:  using (ISession session = factory.OpenSession())
   2:  using (var tran = session.BeginTransaction())
   3:  {
   4:      for (int i = 0; i < 3; i++)
   5:      {
   6:          var post = new PostWithHiLo {Title = string.Format("Identity Generators Revealed {0}", i)};
   7:          session.Save(post);
   8:      }
   9:      tran.Commit();
  10:  }

Neste caso os três comandos INSERT que são gerados, só são enviados após o commit e de uma vez só ao banco. Se estivéssemos utilizando Identity, a cada Save teríamos um INSERT sendo enviado.

Para ver o post completo, acesse o link: http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx

Até mais!

Esse post foi publicado em NHibernate. Bookmark o link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s