Considerando Pool de conexiones

2013-01-29
2013-02-04
  • Granjero Moe

    Granjero Moe - 2013-01-29

    Tras desarrollar una aplicación con OX y tenerla en fase beta me encuentro con que es considerablemente lenta la carga del listado de la clase principal del modelo.
    Por ello me estoy planteando si usando un pool de conexiones podría mejorar el rendimiento.

    Un par de preguntas:
    1. ¿Recomiendan usar pool de conexiones con OX? ¿alguno en concreto? ¿habría que modificar código?
    2. ¿Cómo puedo saber dónde está el cuello de botella que hace que caiga el rendimiento al cargar esta entidad en mi aplicación?, porque las demás van rápidas.

    Saludos y Gracias.

     
  • Federico Alcantara

    Saludos Moe

    1. ¿Recomiendan usar pool de conexiones con OX? ¿alguno en concreto? ¿habría que modificar código?

    Tomcat viene con un pool de conexiones. Fijate el en context.xml.

        <Resource name="jdbc/MiEscuelaDS" auth="Container" type="javax.sql.DataSource"
              maxActive="20" maxIdle="5" maxWait="10000"
              username="sa" password="" driverClassName="org.hsqldb.jdbcDriver"
              url="jdbc:hsqldb:file:../data/mi-escuela-db"/>
    

    Los atributos maxActive, maxIdle corresponden al pool de conexiones.

    Este link puede ayudarte a configurar apropiadamente el pool de tomcat.

    1. ¿Cómo puedo saber dónde está el cuello de botella que hace que caiga el rendimiento al cargar esta entidad en mi aplicación?, porque las demás van rápidas.

    Esto es más dificil, Si es una entidad en particular, quizás debas ver si has utilizado mucho el fetch=eager y se este cargando por completo muchos datos. Podría también ser que tengas algo en el listener, etc. etc.

    Espero te sea útil.

    Federico

     
    Last edit: Federico Alcantara 2013-01-29
  • Granjero Moe

    Granjero Moe - 2013-01-29

    Hola Federico.

    Entonces para mejorar el rendimiento no debo pensar en pool de conexiones más allá de la configuración del mismo.

    En cuanto a la entidad tengo todas las relaciones con fetch=FetchType.LAZY aunque no sé si esto tiene efecto en todas ellas ya que algunas las muestro con un combo así que en ésas supongo que no tiene efecto el fetch=FetchType.LAZY ya que necesita traer los datos sí o sí.
    Para este caso, ¿sería conveniente usar ehcache?

    Tengo algunos campos con la anotación @Formula no sé si esto puede afectar al rendimiento.

    Iré haciendo pruebas comentando código a ver si logro dar con el cuello de botella pero esto es como matar moscas a cañonazos, lo suyo sería poder analizar de alguna manera el rendimiento, no sé si hay consultas lentas, si se hacen demasiadas consultas, si podría optimizar las consultas de alguna manera, etc.

    Si alguien tiene ideas al respecto se agradecen.

    Gracias, saludos.
    GM.

     
  • Granjero Moe

    Granjero Moe - 2013-01-31

    He aislado el problema de rendimiento. Me ha sorprendido.

    El problema es el siguiente:
    Necesito mostrar en el listado unos iconos que representan información de cada item. Estos iconos los pongo de una manera muy fea, pero no logré hacerlo de otro modo: tengo un método en mi entidad que genera el pequeño código html para pintar estos iconos en función de una serie de valores de los atributos de la clase.

    El método es algo así:
    public String getIconos() {
       String iconos;
    
       iconos = getIconoA() + getIconoB() + getIconoC();
    
       return iconos;
    }
    
    public String getIconoA() {
       String etiquetaImg = "<img src='../xava/images/app/iconos/XXXXICONOXXXX' width='15' height='15' />";
       String icono = "";
    
       if (isUrgente() && !getEstaTerminada()) {
          icono = "urgente.gif";
          etiquetaImg = "<a href=''>" + etiquetaImg + "</a>";
       } else
          icono = "transparente.gif";
    
       etiquetaImg = etiquetaImg.replace("XXXXICONOXXXX", icono);
    
       return etiquetaImg;
    }
    

    Los métodos getIconoB y getIconoC son similares pero con cálculos de fechas.

    He probado a quitar el campo iconos del listado y éste se carga en 3.6s la primera vez y en 500ms cuando se cambia de página.
    En cambio si uso el campo iconos en el listado éste se demora hasta 15 segundos.

    Lo que me ha sorprendido es que no parece que sea el código que se ejecuta dentro del método getIconos porque he probado a comentar el código que hay dentro del método y dejar el campo iconos en el listado y el listado sigue tardando entre 10 y 15 segundos en cargar. Es sólo cuando quito el campo iconos del tab cuando gana en velocidad.

    Estoy sorprendido. ¿Alguien tiene alguna explicación? ¿A alguien se le ocurre alguna alternativa a pintar los iconos?

    Saludos.
    GM.

     
  • Javier Paniza

    Javier Paniza - 2013-02-04

    Hola Granjero,

    utilizar una propiedad calculada en el modo lista hace que se tenga que instanciar el objeto por cada fila. Instanciar el objeto puede hacer que JPA ejecute un select por fila para llenar el objeto antes de llamar a las propiedades calculadas. Esto ralentiza, por supuesto que ralentiza, pero con página de 10 elementos (incluso de 20) no debería ser perceptible. Normalmente debería tardar cuando la propia lógica de la propiedad calculada es pesada.

    De todas formas para tu caso yo usaría un formateador para modo lista para esa propiedad, en vez de una propiedad calculada. De esa formas las cosas están en su sitio (porque generar HTML no debería estar en el modelo) y el rendimiento será mucho mejor, porque no se necesita instanciar un objeto por fila.


    Ayuda a otros en este foro como yo te ayudo a ti.
    Antes de poner una pregunta busca en este mismo foro la respuesta
    y lee la documentación de OpenXava en openxava.org.

     

Log in to post a comment.

Get latest updates about Open Source Projects, Conferences and News.

Sign up for the SourceForge newsletter:





No, thanks