Foros del Web » Programación para mayores de 30 ;) » Java »

JSF 1.2 EJB 3.0 No libera memoria y consume los servidores

Estas en el tema de JSF 1.2 EJB 3.0 No libera memoria y consume los servidores en el foro de Java en Foros del Web. Hola Buenas Tardes. Tengo un problema con una aplicación hecha en JSF 1.2, Java1.6, Richfaces 3.3.3 y EJB 3.0, sucede que dicha aplicación es muy ...
  #1 (permalink)  
Antiguo 29/03/2012, 16:20
 
Fecha de Ingreso: enero-2008
Mensajes: 15
Antigüedad: 16 años, 10 meses
Puntos: 0
Exclamación JSF 1.2 EJB 3.0 No libera memoria y consume los servidores

Hola Buenas Tardes.


Tengo un problema con una aplicación hecha en JSF 1.2, Java1.6, Richfaces 3.3.3 y EJB 3.0, sucede que dicha aplicación es muy concurrente a ciertas horas la aplicación no tiene más memoria y se queda sin carga. Entonces, mi pregunta es como podría liberar memoria de esta aplicación, es como que ejecuta queries y no liberará la memoria que usa dicha aplicación, el numero de registros esta subiendo exponencialmente y aún no hemos podido encontrar una solución. Hay 2 servidores (J-BOSS 5.1.0 GA) de 1.4 GB en Memoria cada uno y la aplicación esta bordeando las 1.2 GB, en algún momento la aplicación colapsa y se tiene que reiniciar para que funcione de nuevo.


Alguna idea, sera una solución aumentar la memoria de los servidores?

Algunos tips para que la aplicación libere la memoria que utiliza cuando hace la logica de negocio. Se intento utilizando el comando Runtime.getRuntime().gc() provocando aún más lentitud en los servidores.

Gracias
  #2 (permalink)  
Antiguo 29/03/2012, 20:37
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 9 meses
Puntos: 15
Respuesta: JSF 1.2 EJB 3.0 No libera memoria y consume los servidores

Bueno,

Tu problema es algo de análisis muy preciso, y se necesita recoger información mas detallada para poder definir la solución precisa. Asi que:

Muchos procesos relamente consumen gran cantidad de memoria debido a que estas consultas son almacendadas en memoria... Y realmente esto no es es siempre una buena practica... Son buena practica solo si almacenas tablas muy pequeñas, o por lotes(Paginacion), y sin muchos campos. Pero hay que notar que si tiene muchos usuarios conectados simultaneamente, y se cargan varias consultas en memoria desde el inicio de sesion del usuario con la finalidad de mejorar la velocidad de respuesta al evitar estar ingresando a la base de datos... Este podria ser un error muy grave sin no es posible controlar...

- "De antemano: Apunto que son consultas almacenadas en memoria"

- No es bueno forzar el llamado al GarbageCollector, este ya es un de administracion propia.

1) Algunas consultas es mejor dejarlas en la base de datos.
2) Si cuentas con motores como Oracle, SQL Server, Sybase, DB2, Es muy, muy recomendable el uso de "Stored Procedures y la correcta indexacion" un recuerso que no se puede desperdiciar... (Es súper importante!! ninguna aplicación podrá vencer a la base de datos en procesamiento , ninguna...). Aun si conoces de optimización.
3) Si tienes JBosss, espero trabajas con un pool de conexiones, maximo 30...
4) Para "muchas" sentencias es bueno usar "PreparedStatemen", pero solo si tiene un alta concurrencia... de lo contrario dejalas con "Stament" Únicamente, no hara mucha diferencia... pero cada granito de mejora adicional puede hacer la diferencia.
5) Revisa si no estas dejando conexiones abiertas...
6) Si extraes información orientada a reportes, o listados, nunca los guardes en memoria. Mejor almacenas el resultado en una tabla de la base de datos, y posteriormente aplicas un select sobre la tabla con el id_proceso generado pro el usuario.


Algunos mas que no se me ocurren en el momento...
  #3 (permalink)  
Antiguo 30/03/2012, 05:32
 
Fecha de Ingreso: enero-2008
Mensajes: 15
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: JSF 1.2 EJB 3.0 No libera memoria y consume los servidores

Anteriormente, la aplicación estaba mas lenta aún. Debido a que se usaban entitymanager.createdNamedQuery(), la cual se hacian join consultando la tabla en particular y las tablas relacionadas, lo cual generaba una query muy lenta y pesada. El jefe decidió que ahora las queries se use entitymanager.createdNativeQuery(), creando archivos xml donde se almacenen las queries. Los inserts se realizan tambien con el entitymanager.persist() y las actualizaciones con entitymanager.merge().

Generalmente se hace consultas sobre una tabla, que maneja mucha información es la más importante de la aplicación generalmente se consulta sobre ella.


En el tema del datasource esta manejado de la siguiente manera:

Código PHP:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  
  <local-tx-datasource>
    <jndi-name>DS</jndi-name>
    <connection-url>jdbc:oracle:thin:@xxx:sid</connection-url>
    <driver-class>oracle.jdbc.OracleDriver</driver-class>
    <user-name>usuario</user-name>
    <password>contasena</password>
    <min-pool-size>2</min-pool-size>
    <max-pool-size>5</max-pool-size>
    <idle-timeout-minutes>5</idle-timeout-minutes>
  </local-tx-datasource>
</datasources>
Alguna otra opinión o tip que me pueda ayudar a solucionar este problema.


Muchas Gracias por su colaboración.
  #4 (permalink)  
Antiguo 07/04/2012, 19:59
 
Fecha de Ingreso: enero-2008
Mensajes: 15
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: JSF 1.2 EJB 3.0 No libera memoria y consume los servidores

Buscando información. Encontré algunos Links, que me dieron una pequeña ayuda para encontra la solución a mi problema, que plantée. Los agregó para que a alguien en el futuro les sirva esto es para JSF 1.2. Les adjunto los links, la aplicación ha funcionado mucho mejor desde que parametrizamos, no canto victoria aún. Pero, nos ayudó.

http://hirenscafe.blogspot.com/2010/03/jsf-application-tuning-webapp.html
http://hirenscafe.blogspot.com/2010/03/facelet-performance-webapp-performance.html
https://community.jboss.org/message/566937?_sscc=t

Saludos.

Etiquetas: ejb, jsf, memoria
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:35.