Optimització de l'ús de memòria de les aplicacions basades en Canigó
Context
Actualment estan desplegades als entorns J2EE corporatius de la Generalitat diferents aplicacions desenvolupades amb Canigó. Aquestes aplicacions fan ús dels diferents serveis que Canigó ha desenvolupat basant-se en frameworks Open Source (Spring, Hibernate, Struts, quartz, etc.), i per tant fan ús dels jars que contenen aquestes llibreries de suport. Com que cada aplicació carrega totes les llibreries que necessita, el consum de recursos als entorns corporatius creix.
Aquesta situació, de càrrega repetida de llibreries, es pot solucionar desplegant els jars de forma compartida, de forma que reduïm considerablement el tamany en memòria de cada aplicació desplegada.
Propostes de solució
La separació proposada es la següent, per fer-ho s'ha tingut que fer servir spring en la seva versió per mòduls.
acegi-security-0.9.0.jar |
htmlparser-1.6.jar |
activation-1.1.jar |
httpunit-1.6.jar |
AdobeCSAUtils-1.0.jar |
itext-1.3.1.jar |
ajaxtags-1.1.jar |
jasperreports-1.0.2.jar |
ant-1.6.2.jar |
jaxen-1.1.jar |
antlr-2.7.5H3.jar |
jaxrpc-1.0.jar |
aopalliance-1.0.jar |
jcifs-1.2.6.jar |
apache-ldapber-provider-0.9.jar |
jdbcappender-2.1.01.jar |
apacheds-core-0.9.jar |
jdbm-0.20-dev.jar |
apacheds-main-0.9.jar |
jdom-1.0.jar |
apacheds-shared-0.9.jar |
jdtcore-3.1.0.jar |
asm-1.5.3.jar |
jmock-1.0.1.jar |
asn1-ber-0.3.jar |
jmock-cglib-1.0.1.jar |
asn1-codec-0.3.jar |
jrexx-1.1.1.jar |
asn1-der-0.3.jar |
js-1.6R2.jar |
aspectjrt-1.2.jar |
json-lib-0.6.jar |
aspectwerkz-2.0.jar |
jsr173_api-1.0.jar |
aspectwerkz-core-2.0.jar |
jta-1.0.1B.jar |
aspectwerkz-extensions-2.0.jar |
jtidy-4aug2000r7-dev.jar |
aspectwerkz-jdk14-2.0.jar |
junit-3.8.1.jar |
axis-1.3.jar |
jwebunit-1.2.jar |
axis-ant-1.3.jar |
kerberos-common-0.4.jar |
axis-jaxrpc-1.3.jar |
kerberos-protocol-0.4.jar |
axis-saaj-1.3.jar |
ldap-common-0.9.jar |
axis-wsdl4j-1.3.jar |
ldap-protocol-0.9.jar |
backport-util-concurrent-2.0_01_pd.jar |
log4j-1.2.12.jar |
bcprov-jdk14-124.jar |
mail-1.4.jar |
bsf-2.3.0.jar |
mina-0.7.jar |
canigo-services-configuration-2.2.jar |
mx4j-3.0.1.jar |
canigo-services-core-2.2.jar |
nekohtml-0.9.5.jar |
canigo-services-exceptions-2.2.jar |
ognl-2.6.9.jar |
canigo-services-file-2.2.jar |
ojdbc14_g-10.2.0.1.0.jar |
canigo-services-ftp-2.2.jar |
oro-2.0.8.jar |
canigo-services-http-2.2.jar |
PDFManipulationAPI-1.0.jar |
canigo-services-i18n-2.2.jar |
poi-3.0-alpha3.jar |
canigo-services-jms-2.2.jar |
poi-scratchpad-3.0-alpha3-20061212.jar |
canigo-services-logging-2.2.jar |
qdox-1.5.jar |
canigo-services-mailing-2.2.jar |
quartz-1.4.0.jar |
canigo-services-merging-2.2.jar |
regexp-1.2.jar |
canigo-services-ole-2.2.jar |
saaj-1.0.jar |
canigo-services-persistence-2.2.jar |
saaj-api-1.0.jar |
canigo-services-portlets-2.2.jar |
saaj-impl-1.0.jar |
canigo-services-reporting-2.2.jar |
sapjco-2.1.6.jar |
canigo-services-sap-2.2.jar |
security-5.1.jar |
canigo-services-scheduler-2.2.jar |
servlet-api-2.4.jar |
canigo-services-security-2.2.jar |
snmp-3.0.jar |
canigo-services-validation-2.2.jar |
snmpTrapAppender-1.2.9.jar |
canigo-services-webservices-2.2.jar |
soap-2.3.1.jar |
canigo-services-xml-2.2.jar |
spring-aop.jar |
casclient-2.0.11.jar |
spring-beans.jar |
cglib-2.1_2.jar |
spring-context.jar |
cglib-full-2.0.jar |
spring-core.jar |
cglib-nodep-2.1_2.jar |
spring-dao.jar |
commons-attributes-api-2.1.jar |
spring-hibernate3.jar |
commons-attributes-compiler-2.1.jar |
spring-jdbc.jar |
commons-beanutils-1.7.0.jar |
spring-support.jar |
commons-beanutils-core-1.7.0.jar |
spring-web.jar |
commons-chain-1.0.jar |
spring-webmvc.jar |
commons-codec-1.3.jar |
springmodules-validator-0.4.jar |
commons-collections-3.1.jar |
stax-1.2.0.jar |
commons-digester-1.7.jar |
stax-api-1.0.jar |
commons-discovery-0.2.jar |
trove-1.0.2.jar |
commons-fileupload-1.2.jar |
urlrewrite-3.0.jar |
commons-io-1.1.jar |
valuelist-0.1.7.jar |
commons-jelly-tags-fmt-1.0.jar |
weblogic-1.0.jar |
commons-lang-2.1.jar |
wsdl4j-1.4.jar |
commons-logging-1.0.4.jar |
wstx-asl-2.9.1.jar |
commons-logging-api-1.0.4.jar |
xalan-2.7.0.jar |
commons-net-1.4.0.jar |
xbean-spring-2.1.jar |
commons-primitives-20041207.202534.jar |
xercesImpl-2.7.1.jar |
commons-test-0.1.jar |
xfire-all-1.0-M5.jar |
commons-validator-1.3.0.jar |
xml-apis-1.3.02.jar |
connector-api-1.5.jar |
xmlbeans-2.0-20041214.jar |
datamanager-client-1.0.jar |
xmlbeans-xmlpublic-2.0-20041214.jar |
DocumentServicesLibrary-1.0.jar |
xmlParserAPIs-2.6.2.jar |
dom4j-1.6.1.jar |
xmlpull-1.1.3.1.jar |
easymock-1.1.jar |
xmlunit-1.0.jar |
ehcache-1.2.4.jar |
xom-1.1.jar |
emma-2.0.5312.jar |
xpp3-1.1.3_8.jar |
FastInfoset-1.0.jar |
xstream-1.1.2.jar |
hibernate-3.0.5.jar |
yom-1.0-alpha-2.jar |
hsqldb-1.8.0.1.jar |
|
- Llibreries no compartibles.
canigo-services-fileupload-2.2.jar |
canigo-services-web-2.2.jar |
dwr-1.1.3.jar |
jsp-api-2.0.jar |
jstl-1.1.2.jar |
spring-agent.jar |
spring-aspects.jar |
spring-ibatis.jar |
spring-jca.jar |
spring-jdo.jar |
spring-jms.jar |
spring-jmx.jar |
spring-jpa.jar |
spring-mock.jar |
spring-portlet.jar |
spring-remoting.jar |
spring-struts.jar |
spring-tomcat-weaver.jar |
spring-toplink.jar |
standard-1.0.6.jar |
struts-1.2.7.jar |
struts-layout-1.2_20051027.jar |
struts-menu-2.3.jar |
Per publicar de forma que estalviem memòria, tenim varies possibilitats, que es detallen a continuació en funció d'on publiquem les llibreries compartibles.
Opció 1: Publicació al EAR
Copiem les llibreries compartibles al APP-INF/lib del EAR, la resta haurà d'estar al WEB-INF/lib de cada WAR que formi part del EAR.
Avantatges
- Tots els mòduls d'un EAR comparteixen un classloader, amb lo que estalviem memòria si es despleguen més d'una aplicació que faci servir el framework en el mateix EAR.
Inconvenients
- Nomes es a nivell de EAR, es a dir que si volem definir un altra EAR, haurem de desplegar novament les llibreries compartibles.
Opció 2: Publicació al domini
Publiquem les llibreries compartides a tot el servidor d'aplicacions. En el cas de weblogic la carpeta lib associada al domini
Avantatges
- Estalvi de memòria es molt gran, ja que qualsevol aplicació te accés al classloader d'aquesta manera no nomes es comparteix a nivell de EAR, sinó a nivell de tot el domini.
Inconvenients
- Tota aplicació desplegada ha de funcionar amb la versió del framework definida per aquest domini. No fer-ho pot portar problemes de versions de llibreries.
- Un canvi de llibreries publicades al domini implica reiniciar el domini.
Opció 3: Shared libraries (Weblogic)
Publiquem un paquet de jars de forma que es puguin compartir per totes les aplicacions del domini. Aquesta compartició es fa de manera que aquest paquet de jars es publica al classloader de cada EAR que el fa servir, amb lo que aquest estalvi de memòria es equivalent a la opció 1.
Per realitzar aquesta modificació cal desempaquetar tots els jars compartibles, i tornar-los a empaquetar tots junts afegint el MANIFEST amb el nom de la llibreria i la versió de la forma següent:
Manifest-Version: 1.0
Extension-Name: canigo-services-shared
Implementation-Version: 2.2
Specification-Version: 2.2
Després cada EAR que la vulgui fer servir ha de incloure lo següent al weblogic-application.xml
<library-ref>
<library-name>canigo-services-shared</library-name>
<specification-version>2.2</specification-version>
<implementation-version>2.2</implementation-version>
</library-ref>
Avantatges
- Estalvi de memòria es molt gran, ja que qualsevol aplicació te accés al classloader d'aquesta manera no nomes es comparteix a nivell de EAR, sinó a nivell de tot e domini.
Inconvenients
- Tota aplicació desplegada ha de funcionar amb la versió del framework definida per aquest domini. No fer-ho pot portar problemes de versions de llibreries.
- Un canvi de llibreries publicades al domini implica reiniciar el domini.
|