Frage

Ich verwende NHibernate zur Zeit. Ich habe eine Situation, wo ich auf die Datenbank wie diese eine Reihe von Aufzeichnungen müssen speichern:

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);
}

Wenn es eine Tonne Aufzeichnungen ist diese zu retten ist offensichtlich sehr anstrengend mit der Datenbank, die viele Male getroffen. Was ist ein besserer Ansatz? Gibt es irgendeine Art von Batch-Update kann ich tun? mit einem DataSet bin ich besser dran?

Danke

War es hilfreich?

Lösung

adonet.batch_size Einstellung könnte die Situation verbessern.

Für das müssen Sie

  • set adonet.batch_size in der NH-Konfiguration

Beispiel:

    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();
  • die Stapelgröße auf der Sitzung kurz vor dem Set speichern

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

Andere Tipps

Ich glaube, das ist das, was Sie suchen:

Groß Datenoperationen Mit NHibernate Stateless Sitzungen

Im Wesentlichen stattdessen eine ISession zu öffnen, öffnen Sie eine IStatelessSession, und in Ihrem hibernate.cfg.xml kann eingestellt werden:

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

Ich glaube, Sie haben eine Reihe von Optionen je nach Ihrer Situation.

Wenn Sie NHibernate 2.1 Alphas verwenden können, können Sie versuchen, die neue ausführbare HQL zu verwenden, die verfügbar ist.

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

Tobias Antwort wird auch funktionieren. die Chargengröße gerade Einstellung wird respectably die Leistung erhöhen.

Wenn Sie wollen schmutzig Ihre Hände mit ADO.Net ...

Doing Bulk-Einsätze in SQL Server ist möglich durch die Verwendung von Sql Bulk Copy.

Ein Beispiel dafür ist hier: http://dotnetslackers.com/articles/ado_net/ SqlBulkCopy_in_ADO_NET_2_0.aspx

Für mich scheint es, wie Sie eine neue Einheit zu schaffen eines anderen Unternehmens in der Datenbank basieren. Für mich scheint wie ein ideales Szenario eine gespeicherte Prozedur zu verwenden.

DataSet? Nein. Bulk Insert? Ja.

Wenn Sie, dass viele Datensätze einfügen und die Einsätze sind ziemlich simpel, können Sie die ORM Bulk-Einsätze am Tun und Herausziehen aussehen sollte.

Der schnellste Weg, die Datensätze einzufügen ist eine Textdatei zu generieren und LOAD FILE Syntax. Die meisten Datenbanken haben bemerkenswert schnelle Implementierungen Datendateien in die Datenbanken zu importieren. Für MySQL finden Sie unter:

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

Für andere Datenbanken finden Sie entsprechende Handbuch. Dies ist nützlich, wenn Sie eine Million Datensätze oder Tausende von Datensätzen häufig eingesetzt wird. Ansonsten ist das Beste, was Sie tun können, mit dem 1000s von Einsätzen eine große SQL erstellen und direkt auf dem Datenbank-Verbindung ausführen, überspringen ORMs und ihre zugehörigen Validierungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top