Sunteți pe pagina 1din 10

Recomendaciones para Optimizar una Aplicacin

A diferencia de la optimizacin de una infraestructura, optimizar una aplicacin consiste en revisar los
detalles de implementacin y aplicar un montn de pequeos cambios donde generalmente cada uno
tiene un pequeo impacto sobre el consumo de recursos y/o tiempo de respuesta. En este artculo no se
trata el tema forma genrica, ni es una introduccin sobre el proceso de bsqueda y correccin de bugs,
para lo anterior es ms til el Taller de Pruebas de Carga y Optimizacin publicado en este mismo sitio.
Este artculo realmente est compuesto por un listado de recomendaciones especficas que deben ser
tenidas en cuenta en el desarrollo de una aplicacin. Las recomendaciones estn divididas entre
recomendaciones genricas para Java, recomendaciones para JavaServer Faces, recomendaciones para
bases de datos, entre otras.
Recomendaciones Genricas para Java.
Recomendaciones para Aplicaciones Web.
Recomendaciones para JavaServer Faces.
Recomendaciones para Bases de Datos Oracle.

Recomendaciones Genricas para Java
1. No usar System.out.println()
Recomendacin
Evitar el uso de System.out.println(), este es un recurso serializado y requiere el uso de
I/O en cada llamado.
Parmetros de configuracin
Si eliminar el cdigo del proyecto resulta costoso, puede enviar la salida estndar del
servidor a una salida nula (por ejemplo /dev/null en ambientes UNIX).
Sntomas y Excepciones que caracterizan el problema
* Tiempos de respuesta elevados.
Bibliografa de Referencia
* Performance Anlisis for Java Web Sites. Captulo 2.
2. Mtodos Transaccionales en EJBs.
Recomendacin
En EJBs marcar como transaccionales nicamente los mtodos necesarios.
Parmetros de configuracin
Modificar esta opcin en el archivo ejb-jar.xml de cada EJB.
Por ejemplo:
<container-transaction>
<method>
<ejb-name>EJBEjemploTransaccional</ejb-name>
<method-name>metodoDeConsulta</method-name>
</method>
<trans-attribute>NotSupported</trans-attribute>
</container-transaction>
Sntomas y Excepciones que caracterizan el problema
Baja reutilizacin de conexiones JDBC.
Tiempos de respuesta elevados ante llamados concurrentes.
3. Sentencias Precompiladas.
Recomendacin
Usar al mximo sentencias de base de datos precompiladas a travs de la
clase PreparedStatement cuando ejecute sentencias SQL. Esto evita que la base de datos
compile varias veces la misma consulta y agiliza le ejecucin de la sentencia.
Sntomas y Excepciones que caracterizan el problema
* Tiempos de respuesta de base de datos elevados.
En el caso de Oracle el mismo motor indica las sentencias que se usan sin
precompilar.
4. Paginar Resultados Grandes.
Recomendacin
Paginar los resultados extensos (ms de 100 registros) de bases de datos.
Parmetros de configuracin
Utilice alguna utilidad o limite los resultados de las consultas SQL.
Sntomas y Excepciones que caracterizan el problema
* Consumo de memoria de mquina virtual elevado.
Demoras en al cargar una pgina especfica.
5. Evitar el uso de colecciones sincronizadas.
Recomendacin
Evite el uso de colecciones sincronizadas como Hashtable o Vector, estas
implementaciones tienen todos sus mtodos sincronizados lo que implica que generan
bloqueos incluso para las operaciones de lectura. En vez de ello utilice
implementaciones ms sofisticadas
como ConcurrentHashMap o CopyOnWriteArrayList que slo bloquean las operaciones
que modifiquen el contenido del objeto.
Parmetros de configuracin
A partir de la versin 5 del JDK se incluyen implementaciones para el manejo de la
concurrencia, busque las equivalencias para los objetos usados antes de esta versin.
Sntomas y Excepciones que caracterizan el problema
* Incremento de los tiempos de respuesta ante peticiones concurrentes.
Bibliografa de Referencia
* Java Concurrency in Practice, seccin 5.2.
6. Maneje Adecuadamente las Conexiones con Bases de Datos.
Recomendacin
Las conexiones hacia base de datos son recursos finitos y costosos en trminos de
tiempos de respuesta; para causar el menor impacto en la aplicacin haga caso de las
siguientes recomendaciones:
Siempre que abra una conexin, hgalo en el momento exacto de su uso y
cirrela de forma incondicional.
Cierre la conexin en un bloque finally para que las excepciones no provoquen
referencias perdidas.
Evite que las conexiones o clases que hagan referencia a conexiones sean
atributos de instancia o estticos.
NUNCA pase como referencia el mismo mtodo que devuelve la conexin. Esto
conexiones sin referencia e imposibles de recuperar de forma adecuada.
Cdigo de Ejemplo
Manejo adecuado de una conexin:
Connection conn = null;
try {
// Obtngala dentro del bloque try
conn = ConnectionFactory.getConnection();
//usando la conexin
} catch () {
// si es necesario.
} finally { //Cierre siempre la conexin en un bloque de este tipo
if ((conn != null) && (!conn.isClose)) {
conn.close();
}
}
NUNCA pase como referencia el mtodo que devuelve la conexin:
consultarElementos(ConnectionFactory.getConnection()); //NUNCA haga
esto
Sntomas y Excepciones que caracterizan el problema
* Aparece contnuamente un mensaje indicando que el servidor de aplicaciones cerr
una conexin sin finalizar.
El pool de conexiones crece y no reutiliza las conexiones abiertas previamente.
Degradacin del tiempo de respuesta despus de varias horas o incluso minutos
de uso de la aplicacin.
7. Use Cachs para Evitar Operaciones de Lectura en Disco.
Recomendacin
Si repetidamente necesita leer un archivo almacenado en disco, procure usar un cach
para cargarlo en memoria y realizar las operaciones de lectura de esta forma. El acceso a
disco es una operacin costosa y si slo necesita leer el archivo, el cach es una manera
optimizada de hacerlo.
Use cachs manuales como variables estticas o libreras ms avanzadas como Tangosol
Coherence.
Sntomas y Excepciones que caracterizan el problema
* Problemas de escalabilidad.
Tiempos de respuesta elevados para ciertas operaciones.
8. Lectura de Parmetros desde Un Archivo.
Recomendacin
Abrir y cerrar un archivo es una operacin sumamente costosa en trminos de tiempo,
evite ejecutar este tipo de operaciones de forma masiva.
Si la aplicacin lee parmetros desde un archivo, asegrese que este se cargue una nica
vez en algn mecanismo de cach (puede ser una variable esttica) y que sea desde ah
de donde se lean los valores.
Cdigo de Ejemplo
public CacheConfiguration() {
initBundle();
}

private ResourceBundle cacheBundle = null;
private synchronized void initBundle() {
if (cacheBundle == null) {
cacheBundle = ResourceBundle.getBundle(CONFIG_FILE_NAME);
}
}

public String getLoaderClass(String cacheName) {
try {
return
cacheBundle.getString(cacheName.concat(SUFFIX_LOADER));
}catch (Exception e){
return null;
}

}

public String getOnDemandLoader(String cacheName) {
try {
return
cacheBundle.getString(cacheName.concat(SUFFIX_ON_DEMAND_LOADER));
} catch (Exception e) {
return null;
}
}
Sntomas y Excepciones que caracterizan el problema
* Tiempos de respuesta elevados.
Incremento exponencial en los tiempos de respuesta para peticiones
concurrentes.
9. Verifique el Uso Correcto de Recursos Compartidos.
Recomendacin
Cuando use un recurso compartido ya sea a travs de un patrn singleton o cargndolo
desde algn cach verifique que este recurso no conserve algn estado por
especialmente con el uso de atributos clase.
En caso de tener algn conflicto con este recursos cree una copia usando el
mtodo clone().
Sntomas y Excepciones que caracterizan el problema
* Errores inesperados ante peticiones concurrentes.
Errores del tipo ConcurrentModificationException.


Recomendaciones para Aplicaciones Web
1. Evite al Mximo Almacenar Objetos en Sesin.
Recomendacin
Evite al mximo el almacenamiento de objetos en sesin.
La memoria consumida por estos objetos no se libera rpidamente y puede
generar OutOfMemoryError o tiempos elevados en recoleccin de basura.
Parmetros de configuracin
* Hacer un uso adecuado de variables de instancia y de la sesin en los Backing Beans.
Usar EJBs de sesin stateless.
Evitar el uso de EJBs Sateful.
Sntomas y Excepciones que caracterizan el problema
* Patrones de consumo y liberacin de memoria que indican fugas.
Tiempos de respuesta elevados de forma intermitente.
2. Elimine la Sesin tan Rpido como sea Posible.
Recomendacin
Elimine la sesin tan rpido como sea posible para liberar la memoria consumida.
Parmetros de configuracin
* En lo posible configure un timeout de sesin corto.
Elimnela programticamente cuando el usuario realice ciertas acciones
(presionar un botn para finalizar la sesin, abandonar una pgina, etc).
Sntomas y Excepciones que caracterizan el problema
* OutOfMemoryError.
Poca memoria liberada por el recolector de basura.
3. Optimice el Contenido de las Pginas para Disminuir el Consumo de Ancho de Banda.
Recomendacin
* Eliminar los tags ALT, DIR, AccessKey y Rich:tooltip y las etiquetas que no sean
absolutamente necesarias en las pginas Web.
Marque el contenido esttico para usar cach a nivel del navegador.
Transporte el contenido usando compresin gzip.
Parmetros de configuracin
Asegrese de usar los encabezados HTTP como se indica continuacin:
Cache-Control = public, max-age=86400. Defina un valor adecuado para max-
age.
Expires = 30 das despus de la ltima instalacin u otro valor ms adecuado.
Last-Modified = Fecha de la ltima instalacin.
Adicionalmente se debe asegurar que no est presente el encabezado http
Pragma: no-cache, ste impide que un recurso sea guardado en el cache.
Asegrese que cuando el navegador solicite un recurso esttico, lo haga usando
el encabezado If-Modified-Sincepara que traiga el recurso nicamente si este
cambi desde la ltima actualizacin local.
Sntomas y Excepciones que caracterizan el problema
* Alto consumo de ancho de banda.
Tiempos de respuesta elevados.
4. Use el tag <object> para los applets y configure los parmetros de cach.
Recomendacin
El tag <applet> est obsoleto, use <object> para insertar applets en las pginas Web y
configure los parmetros para hacer cach de los recursos que no cambian
frecuentemente.
Parmetros de configuracin
Un ejemplo del uso del tag es:
<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
width="640" height="500" id="applet">
<PARAM name="code"
value=

"com.heinsohn.runt.common.impresion.applets.ImpresionReportesApplet.cl
ass"
/>
<PARAM name="cache_option" value="plugin" />
<PARAM name="cache_archive"
value="../../AppletsImpresionDocumentos.jar,
../../lib/jasperreports-2.0.5.jar,
../../lib/jasperreports-2.0.5-applet.jar" />
<PARAM name="cache_version" value="1.0.0.1,1.0.0.0,1.0.0.0" />
<PARAM name="document"
value="#{EstadisticaComportamientoVolumenSoatBean.reporte}"
/>
<COMMENT>
<EMBED code=
"com.heinsohn.runt.common.impresion.applets.ImpresionReportesApplet.cl
ass"
width="640" height="500" id="applet" type="application/x-java-applet"
cache_option="plugin"
cache_archive= "../../AppletsImpresionDocumentos.jar,
../../lib/jasperreports-2.0.5.jar,
../../lib/jasperreports-2.0.5-applet.jar"
cache_version="1.0.0.1,1.0.0.0,1.0.0.0"
document="#{EstadisticaComportamientoVolumenSoatBean.reporte}"
MAYSCRIPT="true">
<NOEMBED>
Este navegador no tiene soporte para aplicaciones Java.
</NOEMBED>
</EMBED>
</COMMENT>
</OBJECT>
Note especialmente los parmetros en rojo que indican al manejador de applets que
haga cach de los archivos pasados en la opcin "cache-archive".
Sntomas y Excepciones que caracterizan el problema
* Alto consumo de ancho de banda.
Tiempos elevados en la carga de applets.


Recomendaciones para JavaServer Faces
1. Evite el uso de Bindings en pginas Web.
Recomendacin
No use bindings.
Los objetos usados para hacer enlaces entre controles Web y clases de Java son objetos
bastante pesados y dado que su uso es extensivo, estos elevan considerablemente el
consumo de memoria.
Sntomas y Excepciones que caracterizan el problema
* Consumo excesivo de memoria.
OutOfMemoryError.
2. Optimice el Consumo de Recursos de JavaServer Faces a travs del Archivo web.xml.
Recomendacin
La optimizacin de JavaServer Faces a travs de web.xml puede mejorar el consumo de
ancho de banda y de memoria.
Personalice los siguientes parmetros:
javax.faces.STATE_SAVING_METHOD.
org.apache.myfaces.COMPRESS_STATE_IN_SESSION.
org.apache.myfaces.SERIALIZE_STATE_IN_SESSION.
org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION.
facelets.DEVELOPMENT.
Sntomas y Excepciones que caracterizan el problema
* Alto consumo de ancho de banda.
Tiempos de respuesta elevados.
Referencias
* http://www.waltercedric.com/java-j2ee-mainmenu-53/283-java-server-faces/1215-
recommended-webxml-for-jsf.html


Recomendaciones para Bases de Datos Oracle
1. Secuencias con Cach.
Recomendacin
Crear la secuencias con cach por defecto.
Parmetros de configuracin
En la creacin de la secuencia utilizar un cach con el nmero de peticiones
concurrentes esperados. Usar la instruccin:
create sequence <NOMBRE_SECUENCIA> incremental by 1 start with 1 noclycle
cache <CACHE>.
Dnde CACHE debe ser un valor aproximado al nmero de usuarios concurrentes
esperados usando la secuencia.
Sntomas y Excepciones que caracterizan el problema
* Tiempos de respuesta elevados cuando aumenta el nmero de usuarios concurrentes.
2. Evite el Uso de LIKE.
Recomendacin
Las consultas que se filtran con el operador LIKE pueden tener tiempos de respuestas
muy elevados en tablas medianas/grandes. Evite el uso de este operador, procure usar el
igual (=) y en cuanto sea posible use ndices para las bsquedas en campos de texto.
Sntomas y Excepciones que caracterizan el problema
Tiempos de respuesta elevados en consultas a la base de datos.
3. Evite el Uso de DISTINCT.
Recomendacin
Las consultas que usan el operador DISTINCT para eliminar resultados duplicados son
muy costosas en trminos de tiempo y CPU para grupos grandes de datos. Evite este
operador en lo posible y procure mejor realizar filtros y joins entre tablas de forma que
las consultas no devuelvan valores duplicados.
Sntomas y Excepciones que caracterizan el problema
* Tiempos de respuesta elevados en consultas a la base de datos.
4. Cree ndices con los Campos Usados como Filtros en los y con los Campos usados para
Joins entre Tablas.
Recomendacin
Los ndices mejoran considerablemente el desempeo de las sentencias SQL. Cree
ndices para los campos que se usen como filtros en las condiciones WHERE y crelos
tambin para los campos que se usan en los join entre tablas.
Cuando no est seguro si una consulta est usando un ndice use la sentencia set
autotrace traceonly explain para hacer un anlisis detallado. En SQL Plus
nicamente ejecute la consulta y ver el plan de ejecucin, en SQL Developer ingrese la
consulta y presione F10 para hacer el anlisis respectivo.
Sntomas y Excepciones que caracterizan el problema
* Tiempos de respuesta elevados en consultas a base de datos.
Sentencias que se ejecutan si usar ndices.
5. Limitar Valores para la Condicin IN.
Recomendacin
Al usar una condicin del tipo IN (a, b, c, ) tenga cuidado en no sobrepasar los mil
valores pasados como parmetros a la condicin porque el motor devolver un mensaje
de error. Esto es especialmente til cuando los valores que se usarn como parmetros
en la condicin provienen de una consulta realizada previamente.
Sntomas y Excepciones que caracterizan el problema
* Error: "ORA-01795: el nmero mximo de expresiones en una lista es 1000".

S-ar putea să vă placă și