Resumen Singleton es uno de los patrones de diseño más populares. Su objetivo principal es ahorrar memoria reutilizando y compartiendo una sola instancia en lugar de crear una nueva. Suena bien, pero puede convertirse en un boomerang si se aplica en el caso incorrecto. Me llamo Satria y trabajo en una empresa tecnológica como Software Engineer. En este artículo relato una experiencia propia sobre la implementación equivocada de Singleton y cómo provocó condiciones de carrera que rompieron el sistema.

El problema comenzó cuando desarrollé una aplicación para gestionar el sistema de presupuestos de la compañía, usando PostgreSQL. La aplicación formaba parte del Super App de la empresa. Al revisar el código detecté que cada vez que se consultaba la base de datos se usaba la misma conexión y la misma sesión declaradas como variables globales. A primera vista parecía una optimización razonable para reducir uso de memoria.

Durante mis pruebas locales todo funcionó bien, pero en el proceso de UAT aparecieron muchos problemas. En el primer día llegaron numerosos reportes y el 60 por ciento eran inconsistencias en los datos. Al día siguiente seguían las mismas quejas. Los usuarios reportaban propuestas que no aparecían, datos que cambiaban de forma inexplicable y procesos de aprobación bloqueados.

Al principio sospeché de las relaciones entre tablas y revisé el modelo y el esquema; no encontré errores. También analicé las consultas SQL y todo parecía correcto. Probé los flujos de la aplicación una y otra vez sin éxito. Tras tres días de búsqueda recordé que la aplicación compartía la misma sesión de base de datos para todas las consultas. Al inspeccionar el punto de entrada vi que la app corría con 4 workers y cada worker podía ejecutar hasta 50 threads. Esto provoca una condición de carrera cuando una única sesión es usada por varios hilos simultáneamente.

La solución fue refactorizar para crear una nueva sesión por operación y asegurar su cierre y rollback en caso de error. Por ejemplo en cada función que modifica o consulta se debe instanciar la sesión, usar try except para manejar errores, llamar a rollback si hace falta y cerrar la sesión en finally. Tras aplicar este cambio las inconsistencias desaparecieron y la aplicación pudo desplegarse a producción.

Conclusión Singleton es útil para reducir consumo de memoria pero no todos los tipos de instancias son adecuados para implementarlo. Una conexión de base de datos puede beneficiarse de gestión compartida a nivel de pool, pero una sesión de base de datos mantiene estado y no debe compartirse entre hilos. Implementar un Singleton para una sesión de base de datos es mala práctica y puede causar condiciones de carrera, corrupción de datos y comportamientos impredecibles.

En Q2BSTUDIO somos especialistas en desarrollo de soluciones seguras y escalables. Si necesitas construir aplicaciones robustas y evitar fallos por concurrencia podemos ayudarte a diseñar la arquitectura adecuada, desde aplicaciones a medida hasta servicios cloud y microservicios. Con experiencia en aplicaciones a medida y software a medida diseñamos flujos que gestionan conexiones y sesiones de forma correcta y eficiente. Descubre nuestros servicios de desarrollo en software a medida y aplicaciones a medida y cómo desplegarlos de forma segura en la nube con servicios cloud aws y azure.

Además ofrecemos soluciones en inteligencia artificial, ia para empresas y agentes IA que pueden integrarse con sistemas transaccionales sin comprometer la consistencia de datos. También contamos con servicios de ciberseguridad, pentesting y consultoría para proteger tu plataforma contra fallos y ataques. Si te preocupa la inteligencia de negocio y el análisis de datos, trabajamos con Power BI y servicios de inteligencia para transformar datos en decisiones. Palabras clave relevantes: aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA, power bi.

Recomendación final Diseña cuidadosamente qué objetos pueden ser singletons y cuáles deben crearse por contexto de ejecución. Considera pools de conexiones gestionados por la plataforma, sesiones por petición y mecanismos de sincronización adecuados. Si necesitas apoyo para auditar o reescribir tu arquitectura, en Q2BSTUDIO podemos acompañarte desde la consultoría hasta la implementación.