Volcar fichero texto de gran tamaño en BBDD

Que tengo: en una aplicación que estoy desarrollando, una de las funcionalidades que va a tener es un formulario donde el usuario escoge un determinado fichero de texto que posteriormente se volcará en una tabla.
Ahora mismo, esta funcionalidad ya la tengo hecha (un JPS, action, fachada, DAO y la persistencia con HIBERNATE), pero el problema es que el volcado del fichero tarda unos 10 minutos, y quería saber si existe alguna forma más eficiente de hacer dicho proceso.
La BDD es Oracle.
1
Respuesta
1
Amplíame un poco más, ¿el fichero que contiene?. ¿Un registro por cada linea?, ¿Cada registro lo parseas o mapeas a distintos campos de una tabla? ¿O todo el contenido va directo a un solo campo?.
En principio lo que te sugiero es investigar si Oracle no tiene herramientas para realizar esto (¿para no inventar la rueda no?) Yo se que SQL Server tiene una funcionalidad llamada DTS (data transformation service) que sirve entre otras cosas para esta funcionalidad, y el manejo es de motor de bd directamente, oracle debe tener algo similar y seguro que mejor.
Si no; puedes aplicar algunos de los siguientes trucos. Busca la sentencia sql que tiene oracle para soportar bulck insert (creo que escribe así), esto es crear todos los inserts juntos y enviarlos para que el motor los resuelva como bloque y no enviar cada insert por separado.
La otra es agregar un gestor de inserts (vas a tener que programarlo) para que paralelice las ejecuciones (deberías bajar a la mitad cada ejecución). Desde tu programa le envías las sentencias y este gestiona el paralelismo (multihilo).
La otra es antes de comerzar a insertar enviar un comando sql para eliminar los indices de la tabla, luego insertas y por ultimo restauras los indices.
Igualmente antes de realizar cualquier opción te recomiendo identificar donde están esos 10 minutos, ¿están en tu programa? (Sera que te conectas cada vez que envías una sentencia) o están en el oracle (¿la sentencia es muy compleja?) ¿O tienes varios triggers o constraints o indices sobre dicha tabla que cada insert es muy costoso?.
Hola,
Te detallo más el caso:
-Es un fichero de texto, donde cada registro contiene varios campos separados por #
-Cada uno de estos campos se corresponde con un campo de una tabla.
-Cada vez que tengo que insertar un registro, persisto los cambios sobre la BDD.
También pensé en guardar en memoria todos los registros primero, y después volcarlos todos de una sola vez en la BDD, pero tengo el riesgo de que la aplicación se quede sin memoria.
Me hablaron también de SQL*Loader (para Oracle), pero no sé como integrarlo con JAVA, además esta aplicación después va a ser utilizada por distintos operadores, y en los clientes no va a estar instalado ningún cliente de Oracle.
Un saludo,
sql loader es muy probable que funcione vía alguna sentencia sql, por lo que tu programa en realidad deberá dejar el archivo en un lugar visible a este proceso y efectuar la ejecución desde el java. (No necesitas cliente oracle).
Igualmente si no quieres casarte con ninguna base de datos lo ideal seria que puedas paralelilar la ejecución de los insert's. Para hacer esto tienes que romper tu programa en 2 uno el que lee cada registro y arma cada sentencia insert y el otro que ejecute sentencias sql. Lo que tienes que agregar al primer programa la factultad de invocar las sentencias sql vía múltiples thread de esa manera podes seguir creando sentencias sql mientras estos otros hilos persisten los datos en la base de datos.
Otra que yo utilizo mucho es usar JMS que es la implementación de java para manejo de colas, entonces tu primer programa arma cada sentencia sql y la envía como un msg a un broker jms de mensajería (como productor de mensajes) y el 2do programa (el que persiste en db) seria consumidor de dicho brokers con la salvedad que podes armar varias instancias (teniendo un paralelismo natural) entonces el resultante seria un productor y muchos persistidores.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas