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

JSF, EJB3 consulta con mas de 1000 registros

Estas en el tema de JSF, EJB3 consulta con mas de 1000 registros en el foro de Java en Foros del Web. Hola compañeros. Tengo un proyecto que hasta hace unos dias funcionaba todo bien... pero desde hace como 3 dias tengo problemas. el problema esta al ...
  #1 (permalink)  
Antiguo 14/08/2009, 07:34
 
Fecha de Ingreso: marzo-2009
Mensajes: 37
Antigüedad: 15 años, 1 mes
Puntos: 0
Exclamación JSF, EJB3 consulta con mas de 1000 registros

Hola compañeros.

Tengo un proyecto que hasta hace unos dias funcionaba todo bien... pero desde hace como 3 dias tengo problemas.

el problema esta al hacer una consulta la cual desde hace unos 3 dias aumento a unos 1300 registros.

En la capa de presentacion utilizo JSF, la logica de negocio con EJB3, la db es Firebird y mi servidor web y de aplicaciones es glassfish 2.

Mi entidad a la que estoy consultando tiene las siguientes relaciones:
Código:
    OneToMany(mappedBy = "requisicion")
    private Collection<Ets> etsCollection;
    OneToMany(mappedBy = "requisicion")
    private Collection<RequisicionDetalle> requisicionDetalleCollection;
    JoinColumn(name = "COMPANIA", referencedColumnName = "RFC")
    ManyToOne
    private Compania compania;
    JoinColumn(name = "ESTATUS", referencedColumnName = "ID")
    ManyToOne
    private Estatus estatus;
    JoinColumn(name = "GERENCIA", referencedColumnName = "ID")
    ManyToOne
    private Gerencia gerencia;
    JoinColumn(name = "PRIORIDAD", referencedColumnName = "ID")
    ManyToOne
    private Prioridad prioridad;
    JoinColumn(name = "PROYECTO_OT", referencedColumnName = "ID")
    ManyToOne
    private ProyectoOt proyectoOt;
    JoinColumn(name = "TIPO_OBRA", referencedColumnName = "ID")
    ManyToOne
    private TipoObra tipoObra;
    JoinColumn(name = "CANCELO", referencedColumnName = "ID")
    ManyToOne
    private Usuario cancelo;
    JoinColumn(name = "ASIGNA", referencedColumnName = "ID")
    ManyToOne
    private Usuario asigna;
    JoinColumn(name = "SOLICITA", referencedColumnName = "ID")
    ManyToOne
    private Usuario solicita;
    JoinColumn(name = "REVISA", referencedColumnName = "ID")
    ManyToOne
    private Usuario revisa;
    JoinColumn(name = "AUTORIZA", referencedColumnName = "ID")
    ManyToOne
    private Usuario autoriza;
    JoinColumn(name = "COMPRA", referencedColumnName = "ID")
    ManyToOne
    private Usuario compra;
    JoinColumn(name = "VISTO_BUENO", referencedColumnName = "ID")
    ManyToOne
    private Usuario vistoBueno;
    JoinColumn(name = "APRUEBA", referencedColumnName = "ID")
    ManyToOne
    private Usuario aprueba;
La consulta que hago en la logica de negocio (EJB) es la siguiente:
Código:
    public List<Requisicion> getRequisicionesAsignadas() {
        return em.createQuery(
                "SELECT r FROM Requisicion r WHERE r.estatus.id = 40 ORDER BY r.fechaAsigno DESC").getResultList();
    }
En la capa de presentación tengo el siguiente metodo para tomar el resultado de la consulta:
Código:
   public Requisicion[] listaRequisicionesAsignadas() {
        try {
            List<Requisicion> tempList = requisicionServicioRemoto.getRequisicionesAsignadas(this.usuarioBean.getUsuarioConectado().getId());
            return tempList.toArray(new Requisicion[tempList.size()]);
        } catch (RuntimeException ex) {
            FacesUtilsBean.addInfoMessage(ex.getMessage());
        }
        return new Requisicion[0];
    }

al hacer la consulta no muestra ningun dato, ejecutando el sistema con un debug me lanza el siguiente error: (Bueno esta es una parte del error).
Código:
"nested exception is: java.rmi.RemoteException: CORBA UNKNOWN 1398079690 Maybe; nested exception is: 
	org.omg.CORBA.UNKNOWN: ----------BEGIN server-side stack trace----------
org.omg.CORBA.UNKNOWN:   vmcid: SUN  minor code: 202 completed: Maybe
	at com.sun.corba.ee.impl.logging.ORBUtilSystemException.runtimeexception(ORBUtilSystemException.java:10522)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.convertThrowableToSystemException(CorbaMessageMediatorImpl.java:2084)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleThrowableDuringServerDispatch(CorbaMessageMediatorImpl.java:2034)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleThrowableDuringServerDispatch(CorbaMessageMediatorImpl.java:1987)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:300)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
	at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
	at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
	at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
	at Modelo.Servicios.__RequisicionServicioRemoto_Remote_DynamicStub.getRequisicionesAsignadas(Modelo/Servicios/__RequisicionServicioRemoto_Remote_DynamicStub.java)
	at Modelo.Servicios._RequisicionServicioRemoto_Wrapper.getRequisicionesAsignadas(Modelo/Servicios/_RequisicionServicioRemoto_Wrapper.java)
	at Beans.RequisicionBean.listaRequisicionesAsignadas(RequisicionBean.java:977)
	at Beans.RequisicionBean.getRequisicionesAsignadas(RequisicionBean.java:1250)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:293)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175)
	at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64)
	at com.sun.el.parser.AstValue.getValue(AstValue.java:138)
	at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:206)
	at com.sun.faces.application.ValueBindingValueExpressionAdapter.getValue(ValueBindingValueExpressionAdapter.java:102)
	at javax.faces.component.ValueExpressionValueBindingAdapter.getValue(ValueExpressionValueBindingAdapter.java:73)
	at javax.faces.component.UIData.getValue(UIData.java:582)
	at com.icesoft.faces.component.panelseries.UISeries.getValue(UISeries.java:565)
	at com.icesoft.faces.component.panelseries.UISeries.getDataModel(UISeries.java:347)
	at com.icesoft.faces.component.panelseries.UISeries.processCurrentRowData(UISeries.java:144)
	at com.icesoft.faces.component.panelseries.UISeries.setRowIndex(UISeries.java:136)
	at com.icesoft.faces.component.ext.renderkit.TableRenderer.renderFacet(TableRenderer.java:146)
	at com.icesoft.faces.renderkit.dom_html_basic.TableRenderer.encodeBegin(TableRenderer.java:122)
	at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:788)
	at javax.faces.component.UIData.encodeBegin(UIData.java:879)
	at com.icesoft.faces.component.panelseries.UISeries.encodeBegin(UISeries.java:288)
	at com.icesoft.faces.component.ext.HtmlDataTable.encodeBegin(HtmlDataTable.java:110)
	at com.icesoft.faces.renderkit.dom_html_basic.DomBasicRenderer.encodeParentAndChildren(DomBasicRenderer.java:356)
	at com.icesoft.faces.renderkit.dom_html_basic.GridRenderer.encodeChildren(GridRenderer.java:208)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
	at com.icesoft.faces.component.util.CustomComponentUtils.renderChild(CustomComponentUtils.java:339)
	at com.icesoft.faces.component.util.CustomComponentUtils.renderChildren(CustomComponentUtils.java:325)
	at com.icesoft.faces.component.panellayout.PanelLayoutRenderer.encodeChildren(PanelLayoutRenderer.java:75)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
	at com.icesoft.faces.renderkit.dom_html_basic.DomBasicRenderer.encodeParentAndChildren(DomBasicRenderer.java:358)
	at com.icesoft.faces.renderkit.dom_html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:96)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
	at com.icesoft.faces.component.util.CustomComponentUtils.renderChild(CustomComponentUtils.java:339)
	at com.icesoft.faces.component.paneltabset.PanelTabSetRenderer.writeTabCell(PanelTabSetRenderer.java:924)
	at com.icesoft.faces.component.paneltabset.PanelTabSetRenderer.encodeEnd(PanelTabSetRenderer.java:421)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:836)
	at com.icesoft.faces.renderkit.dom_html_basic.DomBasicRenderer.encodeParentAndChildren(DomBasicRenderer.java:370)
	at com.icesoft.faces.renderkit.dom_html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:96)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
	at com.icesoft.faces.application.D2DViewHandler.renderResponse(D2DViewHandler.java:517)
	at com.icesoft.faces.application.D2DViewHandler.renderResponse(D2DViewHandler.java:522)
	at com.icesoft.faces.application.D2DViewHandler.renderResponse(D2DViewHandler.java:522)
	at com.icesoft.faces.application.D2DViewHandler.renderResponse(D2DViewHandler.java:522)
	at com.icesoft.faces.application.D2DViewHandler.renderResponse(D2DViewHandler.java:522)
	at com.icesoft.faces.application.D2DViewHandler.renderResponse(D2DViewHandler.java:522)
	at com.icesoft.faces.application.D2DViewHandler.renderResponse(D2DViewHandler.java:522)
	at com.icesoft.faces.application.D2DViewHandler.renderResponse(D2DViewHandler.java:522)
	at com.icesoft.faces.application.D2DViewHandler.renderResponse(D2DViewHandler.java:522)
	at com.icesoft.faces.application.D2DViewHandler.renderResponse(D2DViewHandler.java:492)
  #2 (permalink)  
Antiguo 14/08/2009, 07:36
 
Fecha de Ingreso: marzo-2009
Mensajes: 37
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: JSF, EJB3 consulta con mas de 1000 registros

La ultima parte del error es la siguiente:

Código:
at com.icesoft.faces.application.D2DViewHandler.renderView(D2DViewHandler.java:153)
	at org.icefaces.netbeans.rave.web.ui.appbase.faces.ViewHandlerImpl.renderView(ViewHandlerImpl.java:296)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
	at com.icesoft.faces.webapp.http.core.JsfLifecycleExecutor.apply(JsfLifecycleExecutor.java:19)
	at com.icesoft.faces.webapp.http.core.ReceiveSendUpdates.renderCycle(ReceiveSendUpdates.java:122)
	at com.icesoft.faces.webapp.http.core.ReceiveSendUpdates.service(ReceiveSendUpdates.java:73)
	at com.icesoft.faces.webapp.http.core.RequestVerifier.service(RequestVerifier.java:28)
	at com.icesoft.faces.webapp.http.common.standard.PathDispatcherServer.service(PathDispatcherServer.java:24)
	at com.icesoft.faces.webapp.http.servlet.MainSessionBoundServlet.service(MainSessionBoundServlet.java:160)
	at com.icesoft.faces.webapp.http.servlet.SessionDispatcher$1.service(SessionDispatcher.java:42)
	at com.icesoft.faces.webapp.http.servlet.GlassFishAdaptingServlet.service(GlassFishAdaptingServlet.java:60)
	at com.icesoft.faces.webapp.http.servlet.EnvironmentAdaptingServlet.service(EnvironmentAdaptingServlet.java:63)
	at com.icesoft.faces.webapp.http.servlet.SessionDispatcher.service(SessionDispatcher.java:62)
	at com.icesoft.faces.webapp.http.servlet.SessionVerifier.service(SessionVerifier.java:22)
	at com.icesoft.faces.webapp.http.servlet.PathDispatcher.service(PathDispatcher.java:23)
	at com.icesoft.faces.webapp.http.servlet.MainServlet.service(MainServlet.java:153)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
	at com.icesoft.faces.webapp.xmlhttp.BlockingServlet.service(BlockingServlet.java:56)
	at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:315)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288)
	at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647)
	at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579)
	at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831)
	at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
	at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
	at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
	at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
	at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
Caused by: java.lang.OutOfMemoryError: Java heap space
	at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:39)
	at java.nio.ByteBuffer.allocate(ByteBuffer.java:312)
	at com.sun.corba.ee.impl.transport.ByteBufferPoolImpl.getByteBuffer(ByteBufferPoolImpl.java:102)
	at com.sun.corba.ee.impl.encoding.ByteBufferWithInfo.growBuffer(ByteBufferWithInfo.java:239)
	at com.sun.corba.ee.impl.encoding.BufferManagerWriteGrow.overflow(BufferManagerWriteGrow.java:71)
	at com.sun.corba.ee.impl.encoding.CDROutputStream_1_2.grow(CDROutputStream_1_2.java:240)
	at com.sun.corba.ee.impl.encoding.CDROutputStream_1_2.alignAndReserve(CDROutputStream_1_2.java:211)
	at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.internalWriteOctetArray(CDROutputStream_1_0.java:573)
	at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_octet_array(CDROutputStream_1_0.java:592)
	at com.sun.corba.ee.impl.encoding.CDROutputStream.write_octet_array(CDROutputStream.java:302)
	at com.sun.corba.ee.impl.corba.TypeCodeImpl.write_value(TypeCodeImpl.java:1814)
	at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_TypeCode(CDROutputStream_1_0.java:632)
	at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_any(CDROutputStream_1_0.java:612)
	at com.sun.corba.ee.impl.encoding.CDROutputStream.write_any(CDROutputStream.java:390)
	at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.writeAny(Util.java:418)
	at com.sun.corba.ee.impl.io.ValueHandlerImpl.write_Array(ValueHandlerImpl.java:556)
	at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueInternal(ValueHandlerImpl.java:257)
	at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValueWithVersion(ValueHandlerImpl.java:241)
	at com.sun.corba.ee.impl.io.ValueHandlerImpl.writeValue(ValueHandlerImpl.java:179)
	at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.writeArray(CDROutputStream_1_0.java:745)
	at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:923)
	at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:949)
	at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_value(CDROutputStream_1_0.java:690)
	at com.sun.corba.ee.impl.encoding.CDROutputStream.write_value(CDROutputStream.java:451)
	at com.sun.corba.ee.impl.io.IIOPOutputStream.writeObjectField(IIOPOutputStream.java:763)
	at com.sun.corba.ee.impl.io.IIOPOutputStream.outputClassFields(IIOPOutputStream.java:825)
	at com.sun.corba.ee.impl.io.IIOPOutputStream.defaultWriteObjectDelegate(IIOPOutputStream.java:232)
	at com.sun.corba.ee.impl.io.OutputStreamHook.defaultWriteObject(OutputStreamHook.java:164)
	at java.util.Vector.writeObject(Vector.java:1012)
	at sun.reflect.GeneratedMethodAccessor98.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)

----------END server-side stack trace----------  vmcid: SUN  minor code: 202 completed: Maybe"

La verdad estoy preocupado por que no se que fue lo que origino esto... si alguien tiene idea o alguna sugerencia para encontrar lo que estoy haciendo mal y me pueda iluminar un poco le agradeceria mucho la ayuda...
  #3 (permalink)  
Antiguo 14/08/2009, 08:49
 
Fecha de Ingreso: febrero-2005
Mensajes: 34
Antigüedad: 19 años, 2 meses
Puntos: 1
Respuesta: JSF, EJB3 consulta con mas de 1000 registros

Solo por probar podrías ir por trozos, es decir, si son 1000 registros, solicitalos de 200 en 200.
Todavía no he tenido lugar de probar nada con EJB, pero si falla a raíz de un cambio de cantidades, puede ser un timeout, insuficiente memoria del buffer o algo. Incluso puede ser que una fila de la tabla tenga un valor inexperado.

Pero vamos, solo es por decir algo, los EJB solo los conozco de forma teórica.
  #4 (permalink)  
Antiguo 14/08/2009, 11:03
 
Fecha de Ingreso: marzo-2009
Mensajes: 37
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: JSF, EJB3 consulta con mas de 1000 registros

Cita:
Iniciado por jotremar Ver Mensaje
Solo por probar podrías ir por trozos, es decir, si son 1000 registros, solicitalos de 200 en 200.
Todavía no he tenido lugar de probar nada con EJB, pero si falla a raíz de un cambio de cantidades, puede ser un timeout, insuficiente memoria del buffer o algo. Incluso puede ser que una fila de la tabla tenga un valor inexperado.

Pero vamos, solo es por decir algo, los EJB solo los conozco de forma teórica.
Hola gracias por tu sugerencia... Me gustaria hacer eso de solicitarlos de 200 en 200 pero no tengo idea de como hacer eso no sabes donde podria encontrar información sobre como traer por parte los registros de la db...?

Creo que eso solucionaria el problema digo por el error que lanza al hacer la consulta:
Código:
Caused by: java.lang.OutOfMemoryError: Java heap space
  #5 (permalink)  
Antiguo 14/08/2009, 11:20
 
Fecha de Ingreso: febrero-2005
Mensajes: 34
Antigüedad: 19 años, 2 meses
Puntos: 1
Respuesta: JSF, EJB3 consulta con mas de 1000 registros

muy sencillo, por ejemplo en mysql, para indicar de una consulta, cuantos registros quieres: select * from tabla limit 0, 10
eso devolvería los 10 primeros registros.

select * from tabla limit 250,12
este se salta los primeros 250 resultados y devuelve los 12 siguientes

cada base de datos tiene su limitador.

También puede posicionar el puntero del jdbc en la fila que quieras y sacar a partir de ese punto lo que quieras.
  #6 (permalink)  
Antiguo 14/08/2009, 11:32
 
Fecha de Ingreso: marzo-2009
Mensajes: 37
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: JSF, EJB3 consulta con mas de 1000 registros

Cita:
Iniciado por jotremar Ver Mensaje
muy sencillo, por ejemplo en mysql, para indicar de una consulta, cuantos registros quieres: select * from tabla limit 0, 10
eso devolvería los 10 primeros registros.

select * from tabla limit 250,12
este se salta los primeros 250 resultados y devuelve los 12 siguientes

cada base de datos tiene su limitador.

También puede posicionar el puntero del jdbc en la fila que quieras y sacar a partir de ese punto lo que quieras.
Ok Muchas Gracias Probare con eso...
  #7 (permalink)  
Antiguo 14/08/2009, 12:17
 
Fecha de Ingreso: marzo-2009
Mensajes: 37
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: JSF, EJB3 consulta con mas de 1000 registros

Hola primero que nada Gracias por tus sugerencias...

Cambie mi codigo de la consulta ahora es el siguiente:

Código:
    public List<Requisicion> getRequisicionesAsignadas() {
        return em.createQuery(
"SELECT r FROM Requisicion r  WHERE r.estatus.id = 40 ORDER BY r.fechaAsigno DESC")
.setFirstResult(0)
.setMaxResults(10)
.getResultList();
    }
Esto la verdad no sabia que se podia hacer gracias por decirmelo, bueno en realidad no se si es lo mismo que me sugeriste que hiciera. El compaortamiento de la consulta es que me retorna solo los ultimos 10 registros pero solo 10... ese comportamiento es el mismo que tiene lo que me sugeriste...?

si cambio el valor en setMaxResults(500) me retorna las 500 ultimas sin problema alguno.... esto muestra que no fue algun dato el problema y que fue la cantidad de registros...

Bueno de nuevo Muchas gracias por tu ayuda... Ahora si este es el mismo comportamiento de lo que me sugeriste tengo que poner botones en la capa de presentación que al presionarlos traiga los siguientes 10 registros... Me suena a mas trabajo de lo que imagine... alguna vez alguien a hecho este tipo de cosas...?
  #8 (permalink)  
Antiguo 17/08/2009, 13:48
 
Fecha de Ingreso: agosto-2009
Mensajes: 2
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: JSF, EJB3 consulta con mas de 1000 registros

Disculpa voy a tomar tu tema para hacer una consulta..... tengo una aplicacion con 2 tablas pero no tengo idea ... como relacionar las tablas para luego mesclar resultados.....

estas son las tablas por ejemplo

Tabla: Paises
paisid
paisnom

Tabla: Usuarios
id
paisid
usuario

creo en las entidades por cada tabla....

entities
Usuario.java ( de la tabla Usuarios)

package cl.santiago.entity;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
*
* @author rrodriguez
*/
@Entity
@Table(name = "usuarios")
//@NamedQueries({@NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"), @NamedQuery(name = "Usuario.findById", query = "SELECT u FROM Usuario u WHERE u.id = :id"), @NamedQuery(name = "Usuario.findByNick", query = "SELECT u FROM Usuario u WHERE u.nick = :nick"), @NamedQuery(name = "Usuario.findByPassword", query = "SELECT u FROM Usuario u WHERE u.password = :password"), @NamedQuery(name = "Usuario.findByNombre", query = "SELECT u FROM Usuario u WHERE u.nombre = :nombre"), @NamedQuery(name = "Usuario.findByApellido", query = "SELECT u FROM Usuario u WHERE u.apellido = :apellido"), @NamedQuery(name = "Usuario.findByDireccion", query = "SELECT u FROM Usuario u WHERE u.direccion = :direccion")})


public class Usuario implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@Column(name = "nick")
private String nick;
@Basic(optional = false)
@Column(name = "password")
private String password;

@Basic(optional = false)
@Column(name = "pais")
private String pais;

// algo asi dicen que se puede hacer
@OneToMany(cascade = CascadeType.ALL, mappedBy = "propietario")
private Collection capitalCollection;
@JoinColumn(name = "paisid", referencedColumnName = "1")
//

@Basic(optional = false)
@Column(name = "nombre")
private String nombre;
@Basic(optional = false)
@Column(name = "apellido")
private String apellido;
@Basic(optional = false)
@Column(name = "direccion")
private String direccion;

public Usuario() {
}

public Usuario(Integer id) {
this.id = id;
}

public Usuario(Integer id, String pais, String nick, String password, String nombre, String apellido, String direccion) {
this.id = id;
this.pais = pais;
this.nick = nick;
this.password = password;
this.nombre = nombre;
this.apellido = apellido;
this.direccion = direccion;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getNick() {
return nick;
}

public void setNick(String nick) {
this.nick = nick;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getApellido() {
return apellido;
}

public void setApellido(String apellido) {
this.apellido = apellido;
}

public String getDireccion() {
return direccion;
}

public void setDireccion(String direccion) {
this.direccion = direccion;
}

public String getPais() {
return pais;
}

public void setPais(String pais) {
this.pais = pais;
}

}





entities
Pais.java ( de la tabla Pais)


package cl.santiago.entity;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/**
*
* @author rrodriguez
*/
@Entity
@Table(name = "pais")
@NamedQueries({@NamedQuery(name = "Pais.findAll", query = "SELECT p FROM Pais p"), @NamedQuery(name = "Pais.findByPaisId", query = "SELECT p FROM Pais p WHERE p.paisId = :paisId"), @NamedQuery(name = "Pais.findByPaisNom", query = "SELECT p FROM Pais p WHERE p.paisNom = :paisNom")})
public class Pais implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "paisid")
private Integer paisId;
@Basic(optional = false)
@Column(name = "paisnom")
private String paisNom;

public Pais() {
}



@EmbeddedId
protected Pais paisPK;
@JoinColumns({@JoinColumn(name = "paisid", referencedColumnName = "paisid", insertable = false, updatable = false)})
@OneToOne(optional = false)
private Usuario usuario;

public Pais(Integer paisId) {
this.paisId = paisId;
}

public Pais(Integer paisId, String paisNom) {
this.paisId = paisId;
this.paisNom = paisNom;
}

public Integer getPaisId() {
return paisId;
}

public void setPaisId(Integer paisId) {
this.paisId = paisId;
}

public String getPaisNom() {
return paisNom;
}

public void setPaisNom(String paisNom) {
this.paisNom = paisNom;
}

@Override
public int hashCode() {
int hash = 0;
hash += (paisId != null ? paisId.hashCode() : 0);
return hash;
}


}



pero no se como mesclar las tablas y luego mostra todo por un jsf .. a continuacion les muestro como listo SOLO datos del usuarios.... ideal seria mostrar los datos
-------------------------------

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib uri="http: // java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http: // java.sun.com/jsf/html" prefix="h"%>
<%@taglib uri="http: // java.sun.com/jsf/core" prefix="f"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Listado de Clientes</title>
</head>
<body>

<f:view>
<h:form>
<h:messages></h:messages>
<h:commandButton action="create" value="Nuevo Usuario"/>

<h1><h:outputText value="Listado de Usuarios"/></h1>
<h:dataTable value="#{UsuarioController.todos}" var="u" border="1">

<h:column>
<f:facet name="header">
<h:outputText value="Id"/>
</f:facet>
<h:outputText value="#{u.id}"/>
</h:column>

<h:column>
<f:facet name="header">
<h:outputText value="paisnom"/>
</f:facet>
<h:outputText value="#{u.paisnom}"/>
</h:column>



<h:column>
<f:facet name="header">
<h:outputText value="Nombre"/>
</f:facet>
<h:outputText value="#{u.nombre}"/>
</h:column>


</h:dataTable>

<br/>


</h:form>
</f:view>

</body>
</html>
-------------------------------
Bueno algo asi es la idea ...


Estoy ocupando las tecnogias ejb,glasshFish v2.1, mysql,etc

si tienes algun manual donde hagan relaciones... de tablas y que sean visualizados en jsp o web ..... AYUDEN POR FAVOR

GRACIAS!!
  #9 (permalink)  
Antiguo 21/08/2009, 10:36
 
Fecha de Ingreso: agosto-2009
Mensajes: 6
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: JSF, EJB3 consulta con mas de 1000 registros

Hola.
Viendo tu error: "Caused by: java.lang.OutOfMemoryError: Java heap space"

Lo que sucede es que la aplicación (en particular, la consulta que mencionas) ahora utiliza más memoria de la que se asignó a tu servidor de aplicaciones.

Para solucionarlo, se me ocurren 2 opciones:
1. Aumentas la cantidad de memoria al servidor de aplicaciones.
En la consola de glassfish ir a: "application server" ->"configuracion jvm" -> "opciones jvm". Creo que el parámetro que debes aumentar es "-Xmx"
Aunque esta es una solución parche, pues a medida que aumenta el número de registros retornados, aumenta el consumo de memoria.

2. Controlar el número de registros retornados por la (o las) consulta.
Con esto, controlas además, el consumo de memoria.

Saludos.
  #10 (permalink)  
Antiguo 21/08/2009, 10:58
 
Fecha de Ingreso: agosto-2009
Mensajes: 6
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: JSF, EJB3 consulta con mas de 1000 registros

Puedes crear una nueva "NamedQuery" en donde reflejes la relación.

Por ejemplo:

Código:
@NamedQuery(name = "Usuario.Sample", query = "SELECT u.nombre, p.paisNom FROM Usuario u, Pais p WHERE u.direccion = :direccion AND u.idpais = p.idpais")

.
Ten en cuenta que en las "NamedQuery" el modelo que se consulta es el de objetos y no el relacional (las tablas) Esto significa que debes usar los nombres de las entidades jpa en las consultas "sql" y siempre dar un "alias" a las tablas (ejemplo: ... FROM Usuario u, Pais p .... ) Esto se debe a que el pseudonimo representa una instancia de la entidad.

No conozco cómo invocar el namedQuery desde JSF, pero en un EJB seria algo asi:

Código:
@PersistenceContext(unitName = "DB_PU")
private EntityManager em;
...
Query query = em.createNamedQuery("Usuario.sample");
query.setParameter(1, "direccion");
Collection<Object> resultados = query.getResultList();
...
Espero sirva...
Saludos.
  #11 (permalink)  
Antiguo 03/09/2009, 17:10
 
Fecha de Ingreso: marzo-2009
Mensajes: 37
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: JSF, EJB3 consulta con mas de 1000 registros

Cita:
Iniciado por taokiun Ver Mensaje
Disculpa voy a tomar tu tema para hacer una consulta..... tengo una aplicacion con 2 tablas pero no tengo idea ... como relacionar las tablas para luego mesclar resultados.....

estas son las tablas por ejemplo

Tabla: Paises
paisid
paisnom

Tabla: Usuarios
id
paisid
usuario

creo en las entidades por cada tabla....

entities
// algo asi dicen que se puede hacer
@OneToMany(cascade = CascadeType.ALL, mappedBy = "propietario")
private Collection capitalCollection;
@JoinColumn(name = "paisid", referencedColumnName = "1")
//


entities
Pais.java ( de la tabla Pais)



@EmbeddedId
protected Pais paisPK;
@JoinColumns({@JoinColumn(name = "paisid", referencedColumnName = "paisid", insertable = false, updatable = false)})
@OneToOne(optional = false)
private Usuario usuario;

[/COLOR]

pero no se como mesclar las tablas y luego mostra todo por un jsf .. a continuacion les muestro como listo SOLO datos del usuarios.... ideal seria mostrar los datos
-------------------------------

<h1><h:outputText value="Listado de Usuarios"/></h1>
<h:dataTable value="#{UsuarioController.todos}" var="u" border="1">

<h:column>
<f:facet name="header">
<h:outputText value="Id"/>
</f:facet>
<h:outputText value="#{u.id}"/>
</h:column>

<h:column>
<f:facet name="header">
<h:outputText value="paisnom"/>
</f:facet>
<h:outputText value="#{u.paisnom}"/>
</h:column>


-------------------------------
Bueno algo asi es la idea ...


Estoy ocupando las tecnogias ejb,glasshFish v2.1, mysql,etc

si tienes algun manual donde hagan relaciones... de tablas y que sean visualizados en jsp o web ..... AYUDEN POR FAVOR

GRACIAS!!
Mira si ya tienes tus entidades y especificaste las relaciones de las tablas en jsf hago lo siguiente:

Código:
                                                <ice:dataTable id="dataTable1" value="#{requisicionBean.requisicionesSinSolicitar}" var="currentRow" width="100%">
                                                    <ice:column>
                                                        <ice:outputText style="width: 80px" value="#{currentRow['id']}"/>
                                                        <f:facet name="header">
                                                            <ice:outputText value="Id"/>
                                                        </f:facet>
                                                    </ice:column>
                                                    <ice:column>
                                                        <center>
                                                        <ice:outputText  style="width: 80px" value="#{currentRow['rechazada']}"/>
                                                        </center>
                                                        <f:facet name="header">
                                                            <ice:outputText value="Devuelta"/>
                                                        </f:facet>
                                                    </ice:column>
                                                    <ice:column>
                                                        <ice:outputText style="width: 400px" value="#{currentRow['compania'].nombre}"/>
                                                        <f:facet name="header">
                                                            <ice:outputText value="Compañia"/>
                                                        </f:facet>
                                                    </ice:column>
Donde compania es el id de la tabla compañia el cual almaceno en la tabla base q es requisicion... entonces utilizando el id puedes traer los datos de esa tabla como el nombre...

En tu caso seria algo como: value="#{currentRow['idPais'].nombre}

espero te sirva...
  #12 (permalink)  
Antiguo 03/09/2009, 17:15
 
Fecha de Ingreso: marzo-2009
Mensajes: 37
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: JSF, EJB3 consulta con mas de 1000 registros

Cita:
Iniciado por elkamote Ver Mensaje
Hola.
Viendo tu error: "Caused by: java.lang.OutOfMemoryError: Java heap space"

Lo que sucede es que la aplicación (en particular, la consulta que mencionas) ahora utiliza más memoria de la que se asignó a tu servidor de aplicaciones.

Para solucionarlo, se me ocurren 2 opciones:
1. Aumentas la cantidad de memoria al servidor de aplicaciones.
En la consola de glassfish ir a: "application server" ->"configuracion jvm" -> "opciones jvm". Creo que el parámetro que debes aumentar es "-Xmx"
Aunque esta es una solución parche, pues a medida que aumenta el número de registros retornados, aumenta el consumo de memoria.

2. Controlar el número de registros retornados por la (o las) consulta.
Con esto, controlas además, el consumo de memoria.

Saludos.
Gracias por tu sugerencia tome la segunda opcion... quedando de la siguiente manera:

Código:
    public List<ServicioProveedor> getPorLetra(Object letra, int posicionInicio, int tamañoFragmento) {
        return em.createQuery("select object(o) from ServicioProveedor as o WHERE o.servicio.nombre LIKE :letra ORDER BY o.servicio.nombre ASC")
                .setParameter("letra", letra.toString().toUpperCase() + "%")
                .setFirstResult(posicionInicio)
                .setMaxResults(tamañoFragmento)
                .getResultList();
    }
El problema ahora es que utilizo Firebird y funciona bien como unas 8 veces esta consulta despues me tira el siguiente error:

Código:
javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.RemoteException: null; nested exception is: 
	Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: org.firebirdsql.jdbc.FBDriverNotCapableException: Not yet implemented.
Error Code: 0
No si alguna persona por aqui utiliza Firebird para paginar datos me pudiera orientar un poco con esto...
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 05:01.