[nhibernate-br] Gravar registro em bloco no banco via NHibernate ...

145 views
Skip to first unread message

araújo

unread,
Apr 30, 2012, 12:18:09 PM4/30/12
to NHibernate-Br
Salve galera,

Vou dentar descrever o meu problema:
Após realizar o clone de um determinado objeto com seus
relacionamentos, eu preciso inclui-lo no banco, para ser mas exato são
8 tabelas ... "+ ou -, uns 500 registro por tabela" ... com seus
respectivo relacionamentos, depois disso tudo eu executo os insert na
base via NHibernate respeitando os relacionamentos, mas da erro de
Timeout. Pude perceber que o NHibernate gera varios sql de insert ...
"registro a registro" ...
A minha pergunta é ?
Existe alguma maneira de fazer isso em bloco ... "por tabela" ... ?

Desculpe se não não consegui ser claro ...

Plácido Monteiro Dinelli Bisneto

unread,
Apr 30, 2012, 3:51:04 PM4/30/12
to nhiber...@googlegroups.com
Acho que até dá pra fazer usando SQL Nativo ou talvez com HQL mesmo.
Mas eu recomendaria que você fizesse esse tipo de coisa via Stored Procedure.
Não acredito que seja uma coisa que o NHibernate vá fazer melhor que uma BOA Stored Procedure resolva.

Cassiano Kuss

unread,
Apr 30, 2012, 4:01:54 PM4/30/12
to nhiber...@googlegroups.com
Talvez isso possa te ajudar...
--
Você está recebendo esta mensagem porque se inscreveu no grupo "NHibernate-Br" dos Grupos do Google.
Para ver esta discussão na web, acesse https://groups.google.com/d/msg/nhibernate-br/-/vLWQNSqh-xYJ.

Para postar neste grupo, envie um e-mail para nhiber...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para nhibernate-b...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/nhibernate-br?hl=pt-BR.

Allan

unread,
Apr 30, 2012, 4:10:49 PM4/30/12
to nhiber...@googlegroups.com
Na época que precisei inserir registros em lote utilizei Bulk Insert
do .net mesmo

http://blogs.msdn.com/b/nikhilsi/archive/2008/06/11/bulk-insert-into-sql-from-c-app.aspx

Não sei se tem algo deste nível no nhibernate

Em 30/04/12, Cassiano Kuss<cassia...@gmail.com> escreveu:

Rodrigo Silva de Andrade

unread,
Apr 30, 2012, 4:33:18 PM4/30/12
to nhiber...@googlegroups.com
Se performance for crítica, também acho melhor você usar o bulk insert

2012/4/30 Allan <all...@gmail.com>

Rafael

unread,
May 1, 2012, 10:26:21 AM5/1/12
to NHibernate-Br

Bom Dia,

Já tiver que criar um conversor de dados, ontem precisamos migrar
dados de uma estrutra para outra, nesse processo havia uma tabela de
movimentações de estoque, com pouco mais de 130 mil registros, para
importar uma movimentação era necessário primeiramente importar todos
os demais relacionamentos e depois as movimentações com suas devidas
regras de negocio. Como o processo era demorado e utilizar o metodo
session.SaveOrUpdate(entity); gera um cache e estoura a memória então
foi criado um "SalvaSemCache" exemplo:

//Salvar normal
public override T Salva(T entity)
{
//Recupera a sessao corrente
//Poderia se usado dessa forma, mas na declaração será
chamado apenas uma vez a propriedade
NHibernateHttpModule.CurrentSession;
//o using é usado para uma transação atomica caso ocorra
um erro toda a transação será dada rollback.
//using (RepositorioSession)

var session = this.RepositorioSession;


//Inicia uma transação
using (var transacao = session.BeginTransaction())
{
try
{

//Persiste a entidade
session.SaveOrUpdate(entity);

//Comita a transação
transacao.Commit();
}
catch (Exception)
{
//Em caso de erro realiza um Rollback na transação
transacao.Rollback();
throw;
}
}

return entity;
}

//Limpando o "cache"
public override T SalvaSemCache(T entity)
{
//Recupera a sessao corrente
//Poderia se usado dessa forma, mas na declaração será
chamado apenas uma vez a propriedade
NHibernateHttpModule.CurrentSession;
//o using é usado para uma transação atomica caso ocorra
um erro toda a transação será dada rollback.
//using (RepositorioSession)

using (var session = this.RepositorioSession)
{

//Inicia uma transação
using (var transacao = session.BeginTransaction())
{
try
{

//Persiste a entidade
session.SaveOrUpdate(entity);

//Comita a transação
transacao.Commit();
}
catch (Exception)
{
//Em caso de erro realiza um Rollback na
transação
transacao.Rollback();
throw;
}
}

session.Flush();
session.Clear();
}
return entity;
}

=============================================================================
==> ... Lembrando que também foi utilizado um insert direto
a grande diferença entre o insert e o "SalvaSemCache" é os
relacionamentos
quando vc tem um Entidade.Entidade o SalvarSemCache faz o trabalho de
salvar
toda a estrutura, já o insert não salva os relacionamentos!!
=============================================================================

public override T Insert(T entity)
{
using (var session =
ConfigFactory.Instance.SessionFactory.OpenStatelessSession())
{
using (var transacao = session.BeginTransaction())
{
try
{
session.Insert(entity);
transacao.Commit();
}
catch
{
transacao.Rollback();
throw;
}

}
}
return entity;

}


Em resumo utilizei o SalvarSemCache para as regras de negocios após
ter inserido todos os registros em banco com o Insert o resultado foi
de um processamento de 10horas com "estou de memória" para um
processamento de 3 horas com 100% de integridade das movimentações.

Bom espero ter ajudado.

At.
Rafael Da Silva

Rodrigo Silva de Andrade

unread,
May 1, 2012, 10:55:12 AM5/1/12
to nhiber...@googlegroups.com
Um processo que movimenta 120mil registros de uma vez é ETL, sendo que o foco do nhibernate é OLTP. Vocês estão usando a ferramenta errada pro trabalho...

2012/5/1 Rafael <silv...@gmail.com>

Plácido Monteiro Dinelli Bisneto

unread,
May 1, 2012, 9:32:47 PM5/1/12
to nhiber...@googlegroups.com
Pois é...

Por isso recomendei o uso de SPs... Não é a melhor ferramenta do mundo pra se fazer isso, mas com certeza é melhor que tentar fazer isso usando NHibernate...

Rafael

unread,
May 2, 2012, 10:13:16 AM5/2/12
to NHibernate-Br
Verdade, não é o foco do nhibernate e nem a melhor forma, mas apenas
uma possível solução...
Sobre SP eu francamente não usaria, apenas em ultimo dos ultimos
casos, por mais que tenha seus benefícios.

A melhor coisa desses pontos de vistas é que o "Araújo" terá muitas
opções para desenvolver a melhor solução.

At.
Rafael

On 1 maio, 22:32, Plácido Monteiro Dinelli Bisneto <cid...@live.com>
wrote:
Reply all
Reply to author
Forward
0 new messages