2011-11-24 10 views
17

Tengo una aplicación que se está haciendo bastante grande, y el tiempo de inicio de la primavera es de aproximadamente 20 segundos. Para el uso de producción, esto está bien, pero para el desarrollo, esto es un gran dolor.¿Cuál es la mejor manera de perfilar el contenedor de resorte para aprender a optimizar su tiempo de arranque?

¿Qué es una buena herramienta de perfilado o enfoque que me puede dar con precisión la información que necesito para averiguar qué está tomando tanto tiempo? Tal vez es algo que puedo optimizar?

Mi aplicación es una aplicación web primavera/hibernación bastante típica. Hay aproximadamente 50 tablas de bases de datos y varios cientos de beans (como 200-300 ... No conté). Hay algunos beans @Configurable. Muchos escaneos de componentes. También estoy usando Spring Security.

Hice algunos perfiles de primitización con log4j - solo en la configuración INFO. Estas son algunas de las cosas que están teniendo un poco de tiempo:

  • INFO DefaultListableBeanFactory: 555 - únicos-instanciar Pre - 2 segundos
  • INFO SessionFactoryImpl: 202 - edificio de la fábrica sesión - 2 segundos
  • INFO HibernateTransactionManager: 415 - Uso de DataSource [com.mchange.v2.c3p0.ComboPooledDataSource ......] de Hibernate SessionFactory para HibernateTransactionManager - 7 segundos

Hay un par de cosas que toman 0.5 a quizás 1 segundo a lo sumo, pero estos 3 eran las más grandes.

+0

Usted podría estar interesado en [SPR-8767 - Inicialización de bean paralelo durante el inicio] (https://jira.springsource.org/browse/SPR-8767) –

+1

Interesante. Me parece divertido que la persona de Spring dijera que no considerarían esto hasta que varias personas se quejaran de que era demasiado lento. ¿Estoy solo? Pensé que era lento desde 2002:/No importa cuántas computadoras tenga cada pocos años, siempre puedo contar con que los tiempos de arranque de primavera sean lentos. – egervari

+0

Creo que quiso decir que lo considerarían cuando suficientes personas se quejarán de que afecta la productividad +1 por cierto buena pregunta :) –

Respuesta

-1

Se puede utilizar también una visión de Primavera.

1

Una opción que puede probar es usar la opción default-lazy-init para inicializar los beans con pereza. Spring inicializa todos los beans de ámbito único durante la inicialización. Lea frijoles instanciados de forma remota sección del reference doc.

Asegúrese de parametrizar el valor para que pueda cambiarlo por cierto durante el tiempo dev y falsa durante el despliegue de producción.

El escaneo de componentes es lento. Refer to this post sobre cómo deshabilitar esto cuando usa el Autowiring.

+0

Shucks, estoy usando @Autowired para mis beans, no el xml:/Lo intentaré con los beans atributo de nivel superior. Espero que funcione – egervari

+0

Parece que no tengo la primavera para usar el archivo de propiedades con el de nivel superior. Sin embargo no importa. Hace muy poca diferencia cuando incluso código duro :( – egervari

+0

No puedo obtener los beans para no hacer una instancia previa. – theblang

-1

20 segundos para iniciar la aplicación. eso no importa ¡Lo que importa es el tiempo que necesita para ejecutar sus casos de prueba!

  • Por lo tanto, escriba sus pruebas con Mocks que no necesitan para nada iniciarse.
  • Para una mayor integración como las pruebas, intente dividir la configuración, de modo que solo se inicialicen los beans necesarios para algunas pruebas.
+4

Me he quemado muchas veces cuando las pruebas de la capa de servicio no se ejecutaron contra una base de datos real. Tantos problemas de hibernación tontos y cosas que pueden salir mal cuando te burlas de la capa de dao. Tampoco veo mucho probar los controladores como pruebas unitarias: probar las anotaciones y toda la pila es el único tipo de prueba que realmente tiene algún valor real. Si Hibernate no tuviese tantas trampas y escenarios de tiempo de ejecución extraños que no se puedan capturar/probar en la capa de dao, estaría de acuerdo, pero creo que es muy posible que uno se queme por burlarse con aplicaciones de primavera. – egervari

0

Me entristece que todas las respuestas hasta el momento se centran en cómo mejorar el rendimiento y ninguno de ellos realmente le ayudan a hacer el análisis. He utilizado YourKit con gran efecto en otros problemas de generación de perfiles, pero no puedo hablar de su utilidad con el inicio de Spring.

He tenido un buen éxito dividiendo mi configuración de resorte en archivos separados y solo cargando los archivos necesarios para una prueba en particular. Esto funciona especialmente bien para mí porque estoy usando Camel, que es costoso para comenzar y no se usa en la mayoría de mis pruebas. He estado usando H2 para poder ejecutar pruebas de mis DAOs + Services en una base de datos sin ningún inicio/apagado complejo (aunque me tomó un tiempo conectar todo eso correctamente). Sin embargo, todavía tengo un problema al iniciar toda la aplicación para realizar pruebas interactivas. Para mí también es lento.

Cuestiones relacionadas