Pregunta

Estoy usando NHibernate actualmente. Tengo una situación donde tengo que guardar un montón de registros a la base de datos de esta manera:

var relatedTopics = GetRelatedTopics(topic);
foreach (var relatedTopic in relatedTopics /* could be anywhere from 10 - 1000+ */)
{
    var newRelatedTopic = new RelatedTopic { RelatedTopicUrl = relatedTopic, TopicUrl = topic.Name };
    _repository.Save(newRelatedTopic);
}

Cuando hay un montón de registros para guardar esta es, obviamente, muy exigente tener que golpear la base de datos que muchas veces. ¿Qué es un mejor enfoque? ¿Hay algún tipo de actualización por lotes que puedo hacer? ¿Me conviene utilizar un conjunto de datos?

Gracias

¿Fue útil?

Solución

establecer adonet.batch_size podría mejorar la situación.

Para que usted tiene que

  • set adonet.batch_size en la configuración NH

Ejemplo:

    m_sessionFactory = Fluently
         .Configure()
         .Database(MsSqlConfiguration
             .MsSql2005
             .ConnectionString(c => c.FromConnectionStringWithKey("testme"))
             )
         .Mappings(m => m.FluentMappings
             .AddFromAssemblyOf<TestImpl>())
         .ExposeConfiguration(config =>
         {
             config.SetProperty("adonet.batch_size", "1");
             m_configuration = config;
         })
         .BuildSessionFactory();
  • establecer el tamaño de lote en la sesión justo antes de la ahorrar

    using (ISession session = m_nhibernateSessionFactory.GetSession())
    using (var tx = session.BeginTransaction())
    {    
       session.SetBatchSize(1000);     
       foreach (var server in serverz)
       {
          session.SaveOrUpdate(server);
       }
       tx.Commit();
    }
    

Otros consejos

Creo que esto es lo que busca:

granel Sin Estado Sesiones de datos de operaciones con NHibernate

En esencia, en lugar de abrir una ISession, se abre un IStatelessSession, y en su hibernate.cfg.xml puede establecer:

 <property name="adonet.batch_size">100</property>

Yo creo que hay una serie de opciones dependiendo de su situación.

Si puede utilizar NHibernate 2.1 alfas se puede tratar de utilizar el nuevo ejecutable HQL que está disponible.

http://nhibernate.info/blog /2009/05/05/nh2-1-executable-hql.html

La respuesta de Tobias funcionará tan bien. Sencillamente en ajustar el tamaño del lote aumentará el rendimiento respetable.

Si desea ensuciar las manos con ADO.Net ...

Hacer las inserciones en SQL Server es posible mediante el uso de SQL copia masiva.

Un ejemplo de ello es aquí: http://dotnetslackers.com/articles/ado_net/ SqlBulkCopy_in_ADO_NET_2_0.aspx

A mí me parece que va a crear una nueva entidad con sede fuera de otra entidad en la base de datos. Para mí que parece como un escenario ideal para utilizar un procedimiento almacenado.

conjunto de datos? No. Inserción masiva? Sí.

Si está insertando que muchos registros y los insertos son bastante simplista, usted debe buscar en hacer las inserciones y sacando el ORM.

La forma más rápida para insertar registros es generar un archivo de texto y utilizar la sintaxis del archivo CARGA. La mayoría de las bases de datos tienen implementaciones muy rápidas a la importación de archivos de datos en las bases de datos. Para MySQL, véase a continuación:

http://dev.mysql.com/doc /refman/5.1/en/load-data.html

Para otras bases de datos, consulte el manual apropiado. Esto es útil si se está insertando un millón de discos, o miles de registros con frecuencia. De lo contrario, lo mejor que puede hacer es crear un gran SQL con el 1000 de los insertos y ejecución que en su conexión a la base de datos directamente, ORM saltarse las validaciones y sus afines.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top