Ver Mensaje Individual
  #4  
Antiguo 18-11-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Reputación: 24
guillotmarc Va por buen camino
Hola.

Parece bastante lógico pensar que tus problemas vienen por transacciones demasiado largas (en tiempo y nº de registros).

Las transacciones tienen que ser lo más cortas posibles, y sobre todo nunca debes dejar transacciones abiertas con modificaciones realizadas (esos registros quedan bloqueados, con lo que bloquean las importaciones, los procedimientos almacenados, etc. ...). Yo incluso te recomendaría no dejar nunca transacciones abiertas de ningún tipo (ni siquiera que sean de lectura).

Así pues, en tu proceso de importación de datos, ve confirmando las transacciones cada poco rato (por ejplo. cada 500 registros es un buen valor), en lugar de esperar hasta el final de la importación.

Y en tu aplicación, no dejes nunca transacciones abiertas. Si el usuario tiene que modificar datos, ponlos en un ClientDataset, de manera que el usuario puede modificar los datos tan tranquilamente como quiera (ya que no se mantiene ninguna transacción abierta), y cuando sea necesario los aplicas a la base de datos llamando al método ApplyUpdates (eso inicia una transacción, ejecuta las sentencias INSERT, DELETE y UPDATE necesarias para aplicar a la Base de Datos los cambios realizados a los Datos en el ClientDataset, y cierra automáticamente la transacción. Todo el proceso apenas dura unos pocos milisegundos con la transacción abierta).

En definitiva, cuanto más cortas sean tus transacciones, menos posibilidades hay de encontrar bloqueos. Y si las transacciones solo duran unos pocos milisegundos (abres la transacción, lees los datos, se pasan al clientdataset y se cierra, o se realizan los cambios y se cierra) es bastante difícil encontrar bloqueos (yo puedo contar con los dedos de una mano los bloqueos que me he encontrado en diez años usando Firebird).

Respecto al tamaño de la base de datos, yo no me preocuparía lo más mínimo por ello. Firebird es una base de datos multigeneracional, cuando modificas un registro se hace una copia del mismo, eso quiere decir que si hay muchas modificaciones simultaneas en largas transacciones abiertas (como parece ser actualmente tu caso), entonces tienes muchas copias de tus registros. Pero una vez confirmada la transacción, ese espacio se reutiliza. Así que tu Base de Datos crecerá hasta un tamaño determinado para poder mantener todas las versiones en memoria que haces en tu uso normal del programa, y a partir de ese punto solo crecerá moderadamente, a medida que se vayan dando de alta registros.

NOTA: Aunque verás que si haces las transacciones más cortas, tu base de datos también crece mucho menos (ya que no tiene que mantener tantas versiones simultaneas de los registros).

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 18-11-2010 a las 19:45:58.
Responder Con Cita