Je Spring pomalý?

Omlouvám se za ten senzační titulek, ale to víte, chci na tento blog nalákat co nejvíce lidí, pak tu začnu prodávat reklamu a bude ze mě boháč. No a abych vás neochudil i o nějaký ten obsah, opravdu budu dneska psát o výkonnosti Springu, z počátku obecně, na konci se i dozvíte, jak výrazně zvýšit rychlost některých aplikací ve Springu napsaných.

Na nápad, zamyslet se, nad tím, jestli je Spring pomalý mě přivedl jeden kolega. Tvrdil, že pro jeden projekt vybrali EJB 3, protože dělali měření a vyšlo jim, že Spring je pomalý. Takže jak to s tím je?
Samozřejmě, že to je nesmysl. Ani ne tak proto, že by byl Spring tak dokonalý. Je to tím, že Spring nic nedělá. Spring jenom věci spojuje a veškerou práci na někoho deleguje. Napadají mě jenom dvě oblasti, kde by teoreticky mohl Spring někoho zpomalovat. První je start aplikace, kdy startuje aplikační kontext, vytvářejí se proxy a injektují se závislosti. Z mých zkušeností start aplikačního kontextu probíhá velmi rychle i u rozsáhlých projektů (jenom kdyby nezdržoval ten Hibernate). Další oblastí, kde by teoreticky mohl Spring běh aplikace zpomalit je AOP. Ale i to z velké části deleguje na JRE nebo CGLIB. Skoro všechno ostatní neřeší Spring, ale jiné produkty (Hibernate, aplikační server, JDBC, Quartz, ...). Takže zopakujme si to znovu. Spring nic nedělá, jenom nám spojuje kousky skládačky dohromady. Pokud je ta skládačka pomalá, nemůže za to lepidlo, můžou za to ty kousky samotné.

Na příklad uvedu poměrně častý důvod, proč jsou některé aplikace ve Springu pomalé. (Nečekejte žádný zázračný recept). Může za to tento kus konfigurace:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="${jdbc.driverClassName}"/>
	<property name="url" value="${jdbc.url}"/>
	<property name="username" value="${jdbc.username}"/>
	<property name="password" value="${jdbc.password}"/>
</bean>

Objevuje se v ukázkových aplikacích dodávaných se Springem. Stává se, že si programátor nepřečte komentář v XML souboru nebo JavaDocu a tento DataSource použije i na produkci. Kdyby si ten komentář přečetl, zjistil by, že použitý DataSource slouží pouze pro testovací účely - není to žádný connection pool. Pro produkci by měla se použít nějaká knihovna, která se zabývá poolováním DB spojení, například DBCP:

<bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource” destroy-method=”close“>
   <property name="driverClassName" value="${jdbc.driverClassName}"/>
   <property name="url" value="${jdbc.url}"/>
   <property name="username" value="${jdbc.username}"/>
 <property name="password" value="${jdbc.password}"/>
</bean>

Ještě lépší je použít DataSource poskytnutý serverem

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/myDataSource" />
</bean>

Takže až vám příště bude připadat, že je Spring pomalý, uvědomte si, že je chyba pravděpodobně někde jinde. Nejpravděpodobněji mezi klávesnicí a židlí.

2 Responses to “Je Spring pomalý?”

  1. dagi Says:

    http://blog.jinspired.com/?p=156

  2. Lukáš Křečan Says:

    Ten článek (http://blog.jinspired.com/?p=156) jsem taky četl. Musím se přiznat, že jsem ho úplně nepochopil. Z mého pohledu to není o tom, jestli je rychlejší Guice nebo Spring, ale o tom jak je těžké udělat microbenchmark.