Inserción Masiva utilizando GORM grails
Hola, me gustaría que me pudieran ayudar con el siguiente problema, resulta que necesito almacenar más de 100000 registros, sé que al utilizar gorm es lo menos eficiente que puedes hacer, sin embargo leyendo en algunos blogs, muchos disminuian considerablemente el tiempo para el almacenamiento después de liberar la colección que almacena la sesión de grails, sin embargo he notado que la primera vez que lo ejecuto todo va bien, pero cuando intento hacerlo por segunda vez, se alenta demasiado, que puedo estar haciendo mal?, dejo aquí el código que estoy utilizando y gracias.
En mi controlador tengo lo siguiente:
def asignacionMasivaPorAnio() {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
def vigente = configuracionService.findByProceso("0001");
Integer anio = vigente ? Integer.parseInt(vigente?.ejercicio) : Integer.parseInt(sdf.format(new Date()))
//Obtenemos el mapa a asignar
int saved = sucursalBeneficioService.countByAnio(anio)
if (saved > 0)
throw new Exception(" Ya existen asignaciones correspondientes al ejercicio actual")
List mapToSave = sucursalBeneficioService.getMapToSave(anio - 1) //---devuelve una lista como esta [[1,2],[3,4],[5,6]..........[n,n]]
def beneficios = catBeneficioService.findAllByActive(true)
def sucursales = sucursalService.getAll()
def startTime = System.currentTimeMillis()
sucursalService.importBeneficioInSucursal(mapToSave, anio, beneficios, sucursales)
println "time: " + (startTime - System.currentTimeMillis())/1000 + "seconds"
def data = [message: "Asignación Masiva Agregada Correctamente! ", type: "Satisfactorio", success: true]
render data as JSON
} catch (Exception ex) {
def data = [message: "Surgió un error durante la asignación masiva " + ex.getMessage(), type: "Error", success: false]
render data as JSON
}
}
En mi Service tengo lo siguiente
def propertyInstanceMap = DomainClassGrailsPlugin.PROPERTY_INSTANCE_MAP
/**
* Asignacion masiva.....
* @param mapToSave
*/
def importBeneficioInSucursalBeneficio(List mapToSave, anio, def beneficios, def sucursales){
Date fecha = new Date();
int index = 0;
SucursalBeneficio.withTransaction { status ->
try{
mapToSave.each { item ->
CatBeneficio beneficio = beneficios.find { b -> b.id == item[0] }
Sucursal sucursal = centros.find { c -> c.id == item[1] }
def existingcb = SucursalBeneficio.findByBeneficioAndSucursalAndAnio(beneficio, sucursal, anio)
if (!existingcb) {
new SucursalBeneficio(beneficio: beneficio, sucursal: sucursal, anio: anio, active: true, dateCreated: fecha).save()
}
if (index % 1000 == 0) cleanUpGORM()
index++;
}
return mapToSave.size()
}catch (Exception ex){
status.setRollbackOnly()
cleanUpGORM()
return null
}
}
}
protected def cleanUpGORM() {
def session = sessionFactory.currentSession
if( !session )
log.warn "No hibernate session could be retrieved"
session?.flush()
session?.clear()
propertyInstanceMap.get().clear()
}
- Inicie sesión o regístrese para enviar comentarios
Comentarios recientes
hace 3 semanas 1 día
hace 7 semanas 2 días
hace 14 semanas 6 días
hace 22 semanas 6 días
hace 25 semanas 4 días
hace 27 semanas 1 día
hace 30 semanas 2 días
hace 30 semanas 2 días
hace 36 semanas 2 días
hace 37 semanas 3 días