2009-02-18 12 views
7

Ciao Sto lavorando a un progetto in cui è necessario elaborare diversi file xml una volta al giorno e compilare un database con le informazioni contenute in tali file.Inserimento o aggiornamento di NHibernate

Ogni file è circa 1Mb e contiene circa 1000 record; di solito è necessario elaborare tra 12 e 25 di questi file. Ho visto alcune informazioni riguardanti gli inserimenti di massa utilizzando NHibernate, ma il nostro problema è in qualche modo più complicato dal momento che i file xml contengono nuovi record mescolati con i record aggiornati.

Nel xml c'è un indicatore che indica che un record specifico è nuovo o un aggiornamento di un record esistente, ma non quali informazioni sono state modificate. I record xml non contengono il nostro identificativo DB, ma possiamo usare un identificatore dal record xml per localizzare in modo univoco un record nel nostro DB.

La nostra strategia finora è stata quella di identificare se il record corrente è un inserto o un aggiornamento e in base al quale eseguiamo un inserimento sul DB o facciamo una ricerca, quindi aggiorniamo le informazioni sull'oggetto con il informazioni provenienti dal record xml e infine facciamo un aggiornamento sul DB.

Il problema con il nostro approccio attuale è che stiamo avendo problemi con i blocchi DB e le nostre prestazioni si degradano molto velocemente. Abbiamo pensato ad alcune alternative come avere tabelle separate per le operazioni distinte o anche le DB separate, ma fare una mossa del genere significherebbe un grande sforzo, quindi prima di prendere qualsiasi decisione vorrei chiedere l'opinione della comunità su questo argomento, grazie in anticipo.

risposta

17

Un paio di idee:

  • Cercate sempre di utilizzare IStatelessSession per operazioni di massa.
  • Se non sei ancora soddisfatti delle prestazioni, basta saltare NHibernate e utilizzare una stored procedure o query con parametri specifici per questo, o utilizzare IQuery.ExecuteUpdate()
  • Se stai usando SQL Server, è possibile convertire il formato XML BCPFORMAT xml quindi esegui BULK INSERT su di esso (solo per gli inserimenti)
  • Se hai troppi blocchi DB, prova a raggruppare le operazioni (cioè prima scopri cosa deve essere inserito e cosa viene aggiornato, quindi ottieni PK per gli aggiornamenti , quindi esegui BULK INSERT per gli inserimenti, quindi esegui gli aggiornamenti)
  • Se l'analisi dei file di origine è un problema di prestazioni (ovvero, al massimo un core della CPU), provare a farlo in parallelo (è possibile utilizzare Parallel Extensions)
Problemi correlati