Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

martes, 3 de junio de 2014

Npgsql lanza una System.OutOfMemoryException

Jugaba un día con el C#, las librerías del Npgsql y con una base de datos con dos tablas vinculadas entre sí por una llave foránea. Luego de insertar unos cuantos registros en ambas tablas, intenté borrar los registros de una de ellas y entonces saltó esta excepción:


Saltó una "System.OutOfMemoryException". Llegué a pensar que mi programita tendría fugas de memoria en algún lado, pero al intentar borrar los mismos registros desde el pgAdmin III saltaba el verdadero error: violación de las reglas de la llave foránea.

Me pareció curioso así que, luego de experimentar un poco, descubrí que el Npgsql lanza la System.OutOfMemoryException cada vez que se viola una relación de llaves foráneas (en mi caso: intentar borrar los registros cuyas llaves primarias estaban vinculadas hacia la otra tabla por medio de la llave foránea).
En general, esta excepción suele saltar si se violan las reglas establecidas para las secuencias (datos de tipo serial), llaves primarias y llaves foráneas.

Pero me quedaba una pregunta: ¿no debería saltar una InvalidOperationException?

Mi teoría es la siguiente: una llave foránea es en realidad un puntero hacia los datos de otra tabla. Al querer realizar una operación no permitida (por ejemplo intentar borrar los datos a donde apunta el puntero pero sin borrar el puntero) se tiene un puntero que apunta (valga la redundancia) hacia un área de memoria que ahora es inválida. Para colmo, el sistema operativo (si es código no administrado no hay colector de basura) no puede reasignar esa memoria para su uso posterior ni liberar el puntero. En resumen: resulta una fuga de memoria, la cual se traduce (al pasar ya al mundo del código administrado del .Net) como una OutOfMemoryException.

Para saber más del tema de los punteros y sus problemas, recomiendo este pdf.