Tuesday, December 15, 2009

Un nuevo proyecto

Pues se me ha ocurrido la idea de entrar en el mercado de forex, a ver que tal
me va, mientras tanto ya estoy estudiando todo el rollol, :D será mi nuevo
proyectin inconcluso por el momento.

Wednesday, September 30, 2009

Avance a la estacion de juegos

Ahora les traigo el avance de la estación de juego que documente
en una entrada anterior, le mande a hacer un cajoncito, de madera
y lo conecte a la PC y a jugar como en las arcadias.

Aqui una imagen:


Como se puede observar en la imagen -ademas de mis tenis apestosos
- el cajon cuenta con bisagra para poder hacer conexiones y dar
mantenimiento cuando algo falle.

Y otra:


Pero no se preocupen, queridos 20,000 lectores, este proyecto aun
sigue estando inconcluso pues falta el control secundario para echar retas.

RaY

Saturday, August 08, 2009

Too many open connections

Ese error del titulo aparecia una y otra y otra vez con mi aplicación hecha en struts + hibernate
me da un poco de verguenza aceptarlo pero me llevo como 6 meses repararlo - no me dedico diario a ella pero aun así es mucho tiempo - y ahora que lo resolví estoy algo euforico así que para
acordarme de este momento posteo la solución. Tal vez le ayude a alguien:

Lo primero que pense con ese error era que no estaba cerrando la sesion, dije claro por ahi
debe haber algun llamado a base donde olvide cerrarla, pero despues de revisar una por una,
varias veces ahi estaba session.close(); pues no era eso.

La segunda cosa en la que sospeche fue la base de datos (mysql) dije seguro tiene un bug
esa cosa, asi que hice pruebas, investigue y no solo me di cuenta de que no era sino que tambien
gracias a la respuesta de un participante en el bug tracking de mysql supe que no debia usar
el connection pooling nativo de hibernate para un ambiente productivo, asi que cambie a c3p0, pero tampoco era eso, el "too many open connections" seguia atormentandome despues de unas cuantas consultas.

Así que finalmente cuando todo estaba perdido era hora de leer el manual, a refinarme mas teoria de Hibernate, pues ahi estaba el pex, en realidad no sabia lo que estaba haciendo, eso pasa por aprender esta clase de cosas al vapor, muchas veces solo entiendes una embarrada, vamos al grano:

El problema.

Al abrir la sesion llamaba un metodo llamado abreConexion que al principio llamaba al siguiente codigo:


Configuration cfg = new Configuration();
cfg.setProperties(System.getProperties());
cfg.configure();
SessionFactory sessions = cfg.buildSessionFactory();

return sessions.openSession();



Pues claro, como ese codigo se ejecutaba con cada conexión, tenia una nueva fabrica de sessiones cada vez, y por consiguiente un pool de conexiones por cada fabriquita, así cada busqueda abria varias conexiones sin cerrarlas (pues estan en pool) hasta que me salia el mensajito del demonio.

La solucion.

Sencillo separar en una clase independiente la creacion de la fabriquita, con su respectivo metodo get para obtener la fabrica (la misma cada vez):


import org.hibernate.*;
import org.hibernate.cfg.*;


public class HibernateUtil {

private static final SessionFactory sessionFactory;


static {
try {

sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable e) {

System.err.println("Initial SessionFactory creation failed:" + e);
throw new ExceptionInInitializerError(e);
}
}

public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}



Lo demas es historia en mi metodo abreConexion solo llamo el metodo getSessionFactory y listo
adios problemas, ademas de que no aparece el error la aplicacion es mucho mas rapida pues la creación de la fabrica es muy lenta.


RaY... RTFM!!!