Foros del Web » Programación para mayores de 30 ;) » Java »

Struts 2 + Spring + Hibernate + DWR

Estas en el tema de Struts 2 + Spring + Hibernate + DWR en el foro de Java en Foros del Web. Hola: Estoy desarrollando una aplicación que utiliza Struts 2 para la capa de vista/presentación, Spring en la lógica de negocio e Hibernate como motor de ...
  #1 (permalink)  
Antiguo 07/12/2007, 18:26
 
Fecha de Ingreso: julio-2005
Mensajes: 7
Antigüedad: 18 años, 9 meses
Puntos: 0
Struts 2 + Spring + Hibernate + DWR

Hola:

Estoy desarrollando una aplicación que utiliza Struts 2 para la capa de vista/presentación, Spring en la lógica de negocio e Hibernate como motor de persistencia.

La arquitectura utilizada es muy robusta y estoy intentando evolucionarla, por lo que estoy cambiando Struts 1.3.x por Struts 2.x y además añado DWR para utilizar la tecnología AJAX.

Estoy realizando una gestión de usuarios y en el formulario de creación utilizo AJAX para seleccionar las localidades de una provincia.

El problema es que cuando pulso el botón para mostrar el formulario de creación, tarda cerca de 13 segundos. Todo esto es debido a los "lazy" que se colocan en los "hbm" de hibernate.

Me gustaría saber como puedo evitar que tarde tanto en hacer esto, es como si cargara de la BD las más de 9000 localidades que hay para que cuando se seleccione la provincia sea instantaneo.

A continuación coloco el código de los archivos involucrados.

datosUsuario.jsp (formulario de creación de usuario)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<p>
${accion} Usuario
</p>


<s:form action="doCrearUsuario" method="post">
<s:textfield label="Nombre" name="usuario.nombre" ></s:textfield>

<s:textfield label="Apellido1" name="usuario.apellido1" ></s:textfield>

<s:textfield label="Apellido2" name="usuario.apellido2" ></s:textfield>

<s:textfield label="NIF" name="usuario.nif" ></s:textfield>

<s:textfield label="Dirección" name="usuario.direccion" ></s:textfield>

<s:textfield label="Email" name="usuario.email" ></s:textfield>

<s:textfield label="Teléfono" name="usuario.telefono" ></s:textfield>

<s:textfield label="Cód. Postal" name="usuario.codigoPostal" ></s:textfield>

<s:textfield label="Login" name="usuario.login" ></s:textfield>

<s:password label="Password" name="usuario.password" ></s:password>



<s:if test="${usuario.activo=='1' || accion=='Crear' }">
<s:set name="activacion" value="%{'true'}" />
</s:if>
<s:elseif test="${usuario.activo=='0'}">
<s:set name="activacion" value="%{'fasle'}" />
</s:elseif>



<s:checkbox label="Activo" name="usuario.activo"
value="${activacion}"></s:checkbox>

<s:select label="Perfil" listValue="nombre" listKey="idPerfil"
list="listaPerfiles" />

<s:select id="provincia" label="Provincia" listValue="nombre" listKey="idProvincia"
list="listaProvincias" name="${prov}"
onchange="Ajax.getLocByProv(objectEval($('provinci a').value), rellenaLocalidades);"/>

<s:select id="localidad" label="Localidad" listValue="nombre" listKey="idLocalidad"
list="listaLocalidades" name="${usuario.localidades.idLocalidad}" />

<s:submit value="Aceptar" />
<s:reset value="Limpiar" />
<s:submit action="cancelUserForm" value="Cancelar"
onclick="form.onsubmit=null" />
</s:form>




AjaxServiceImpl.java (clase con el método para seleccionar las localidades de una provincia)

public class AjaxServiceImpl implements AjaxService{

private static final Logger log = Logger.getLogger(AjaxServiceImpl.class);

private ProvinciasDAO provinciasDao;

private LocalidadesDAO localidadesDao;





public LocalidadesDAO getLocalidadesDao() {
return localidadesDao;
}



public void setLocalidadesDao(LocalidadesDAO localidadesDao) {
this.localidadesDao = localidadesDao;
}



public ProvinciasDAO getProvinciasDao() {
return provinciasDao;
}



public void setProvinciasDao(ProvinciasDAO provinciasDao) {
this.provinciasDao = provinciasDao;
}


public List getLocByProv(String idProvincia)
throws ServiceException {
log.debug(Constantes.COMIENZA_METODO);
List listLocalidades = new ArrayList();

ProvinciasService provService = (ProvinciasService) Factory
.getBean(CtesPortales.PROVINCIAS_SERVICE_BEAN_NAME );

Provincias prov=provService.findById(Integer.parseInt(idProvi ncia));

log.debug("provincia: "+prov.getIdProvincia()+" y su nombre: "+prov.getNombre());

LocalidadService localidadService = (LocalidadService) Factory
.getBean(CtesPortales.LOCALIDADES_SERVICE_BEAN_NAM E);

listLocalidades=localidadService.findByProvincia(
prov.getIdProvincia().toString());

log.debug("numero de localidades de la provincia: "+idProvincia+": "+
listLocalidades.size());

log.debug(Constantes.TERMINA_METODO);
return listLocalidades;
}
}


Localidades.hbm.xml (archivo de mapeo de hibernate de localidades, los lazy se los he puesto yo porque sino daba errores)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="es.myapp.portales.business.objects.Localidad es" table="localidades" schema="public">
<id name="idLocalidad" type="java.lang.Long">
<column name="id_localidad" />
<generator class="assigned" />
</id>
<many-to-one name="provincias" class="es.myapp.portales.business.objects.Provinci as"
fetch="select" lazy="false">
<column name="provincia" />
</many-to-one>
<property name="nombre" type="java.lang.String">
<column name="nombre" length="200" not-null="true" />
</property>
<set name="usuarioses" inverse="true" lazy="false" >
<key>
<column name="localidad" />
</key>
<one-to-many class="es.myapp.portales.business.objects.Usuarios " />
</set>
</class>
</hibernate-mapping>



Provincias.hbm.xml (archivo de mapeo de hibernate de provincias, los lazy se los he puesto yo porque sino daba errores)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="es.myapp.portales.business.objects.Provincia s" table="provincias" schema="public">
<id name="idProvincia" type="java.lang.Integer">
<column name="id_provincia" />
<generator class="assigned" />
</id>
<property name="nombre" type="java.lang.String">
<column name="nombre" length="150" not-null="true" />
</property>
<set name="localidadeses" inverse="true" lazy="false">
<key>
<column name="provincia" />
</key>
<one-to-many class="es.myapp.portales.business.objects.Localida des" />
</set>
</class>
</hibernate-mapping>


Funciones Javascript

function objectEval(text){
text = text.replace(/\n/g, ' ');
text = text.replace(/\r/g, ' ');
if (text.match(/^\s*\{.*\}\s*$/))
{
text = '[' + text + '][0]';
}
return eval(text);
}


function rellenaLocalidades(data){
DWRUtil.removeAllOptions("localidad", data);
DWRUtil.addOptions("localidad", data, "idLocalidad", "nombre");
}


CrearUsuarioFront.java (Action que muestra el formulario de creación de usuario)


public class CrearUsuarioFrontAction extends ActionSupport implements
ServletRequestAware {

/**
* Objeto log de trazas
*/
private static final Logger log = Logger
.getLogger(CrearUsuarioFrontAction.class);

private HttpServletRequest servletRequest;

private List listaPerfiles = new ArrayList();

private List listaProvincias = new ArrayList();

private List listaLocalidades = new ArrayList();

private String prov;

public String getProv() {
return prov;
}

public void setProv(String prov) {
this.prov = prov;
}

public List getListaLocalidades() {
return listaLocalidades;
}

public void setListaLocalidades(List listaLocalidades) {
this.listaLocalidades = listaLocalidades;
}

public List getListaProvincias() {
return listaProvincias;
}

public void setListaProvincias(List listaProvincias) {
this.listaProvincias = listaProvincias;
}

public List getListaPerfiles() {
return listaPerfiles;
}

public void setListaPerfiles(List listaPerfiles) {
this.listaPerfiles = listaPerfiles;
}

public HttpServletRequest getServletRequest() {
return servletRequest;
}

public void setServletRequest(HttpServletRequest servletRequest) {
this.servletRequest = servletRequest;
}

public String execute() throws ServiceException {
log.debug(Constantes.COMIENZA_METODO);
servletRequest.setAttribute(Constantes.PARAM_ACCIO N,
Constantes.ACCION_CREAR);

PerfilesService perfilService = (PerfilesService) Factory
.getBean(CtesPortales.PERFILES_SERVICE_BEAN_NAME);

listaPerfiles = perfilService.findAll();

log.debug("numero de perfiles: " + listaPerfiles.size());

ProvinciasService provinciaService = (ProvinciasService) Factory
.getBean(CtesPortales.PROVINCIAS_SERVICE_BEAN_NAME );

listaProvincias = provinciaService.findAll();

log.debug("numero de provincias: " + listaProvincias.size());

LocalidadService localidadService = (LocalidadService) Factory
.getBean(CtesPortales.LOCALIDADES_SERVICE_BEAN_NAM E);

listaLocalidades = localidadService.findByProvincia(
Config.get(Constantes.CFG_PROVINCIA_DEFECTO));

log.debug("numero de localidades: " + listaLocalidades.size());

prov=Config.get(Constantes.CFG_PROVINCIA_DEFECTO);

log.debug(Constantes.TERMINA_METODO);
return SUCCESS;
}

}







Muchas gracias de antemano
  #2 (permalink)  
Antiguo 09/12/2007, 11:45
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Re: Struts 2 + Spring + Hibernate + DWR

El uso de lazy load hay que analizarlo bien para que nos de un rendimiento adecuado.

Tendrias que ver que objetos relacionados son poco solicitados y a esos definirle el lazy load como true (para no cargarlos una y otra ves sin usarlos).

Lo contrario hay que hacer con los objetos relacionados que se solicitan mucho en conjunto. Por ejemplo si tenemos una clase Factura y otra clase LineaFactura, es muy probable que cuando pida una factura, tambien le pida a la factura sus Lineas, por lo que hacer lazy load aquí no tiene sentido.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:37.