2009-02-18 15 views
7

Hola, estoy trabajando en un proyecto en el que necesitamos procesar varios archivos xml una vez al día y completar una base de datos con la información contenida en esos archivos.Inserción o actualización masiva de NHibernate

Cada archivo tiene aproximadamente 1Mb y contiene aproximadamente 1000 registros; usualmente necesitamos procesar entre 12 y 25 de estos archivos. He visto información sobre inserciones masivas usando NHibernate, pero nuestro problema es de alguna manera más complicado ya que los archivos xml contienen nuevos registros mezclados con registros actualizados.

En el xml hay un indicador que nos dice que un registro específico es uno nuevo o una actualización de un registro existente, pero no la información que ha cambiado. Los registros xml no contienen nuestro identificador de base de datos, pero podemos usar un identificador del registro xml para ubicar de manera única un registro en nuestro banco de datos.

Nuestra estrategia hasta ahora ha sido identificar si el registro actual es un inserto o una actualización y en base a eso, o bien realizamos una inserción en el DB o hacemos una búsqueda, luego actualizamos la información del objeto con el información proveniente del registro xml y finalmente hacemos una actualización en el DB.

El problema con nuestro enfoque actual es que estamos teniendo problemas con los bloqueos de DB y nuestro rendimiento se degrada muy rápido. Hemos pensado en algunas alternativas, como tener tablas separadas para las distintas operaciones o incluso DB separadas, pero realizar tal movimiento supondría un gran esfuerzo, así que antes de cualquier decisión que desee solicitar a la opinión de la comunidad sobre este asunto, gracias de antemano.

Respuesta

17

Un par de ideas:

  • Siempre trate de usar IStatelessSession para las operaciones a granel.
  • Si todavía no estás contento con el rendimiento, acaba de saltar NHibernate y utilizar un procedimiento almacenado o una consulta con parámetros específicos para esto, o utilizar IQuery.ExecuteUpdate()
  • Si está utilizando SQL Server, se puede convertir el formato XML para BCPFORMAT xml luego ejecute BULK INSERT en él (solo para inserciones)
  • Si tiene demasiados bloqueos de base de datos, intente agrupar las operaciones (es decir, primero descubra qué debe insertarse y qué se actualizó, luego obtenga las farmacias para las actualizaciones , luego ejecute BULK INSERT para las inserciones y luego ejecute actualizaciones)
  • Si el análisis de los archivos fuente es un problema de rendimiento (es decir, maximiza el núcleo de la CPU), intente hacerlo en paralelo (puede usar Parallel Extensions)
Cuestiones relacionadas