jsf - sessionscoped - Demasiadas sesiones activas
managed bean scope view</ managed bean scope (1)
¿Por qué el servidor crea demasiadas sesiones?
Debido a que envió unos cientos de solicitudes y el servidor aparentemente está configurado para crear sesiones X máx.
Utilicé RequestScope y Stateless Bean, ¿cómo es que terminan en sesión?
Ellos no lo hicieron. El estado de la vista JSF sí. Al configurar el método de ahorro de estado JSF en el server
, que es la configuración predeterminada, JSF almacenará el estado de la vista en la sesión HTTP.
¿Qué puedo hacer para superar esta situación?
Establezca el método de ahorro de estado JSF en el client
mediante este parámetro de contexto en web.xml
.
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
De esta forma, el estado de la vista JSF en forma serializada se almacenará en el campo de entrada oculto javax.faces.ViewState
del formulario JSF en lugar de en la sesión HTTP.
O bien, cuando utilice Mojarra 2.1.19 o posterior, simplemente desactive el ahorro de estado JSF según la vista estableciendo el atributo transient
de <f:view>
en true
.
<f:view transient="true">
(Puede ajustar <f:view>
alrededor de <h:head>
/ <h:body>
; esto también es lo que JSF está haciendo implícitamente: representa el componente UIViewRoot
)
Ver también:
Estoy usando JSF 2 en JBoss 6. Hice una aplicación de muestra que utiliza JSF como la Vista, EJB para la lógica y JPA para Persistencia. El bean en JSF tiene RequestScoped. EJB es sin estado:
<?xml version=''1.0'' encoding=''UTF-8'' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<title>Long HDi</title>
</h:head>
<h:body>
<c:forEach var="tweet" items="#{tweets.getAll}">
<p>
#{tweet.content}<br />
</p>
</c:forEach>
</h:body>
</html>
Frijol:
@Named("tweets")
@RequestScoped
public class Tweets implements Serializable {
@EJB
private TweetServiceLocal tweetService;
private List<Tweet> tweets;
public List<Tweet> getGetAll() {
return tweetService.findAllSortedByTimeDesc();
}
}
EJB:
@Stateless
public class TweetService implements TweetServiceLocal {
@PersistenceContext(unitName = "LongHDi-ejbPU")
private EntityManager em;
@Override
public Tweet create(final String content, final Date postTime) throws ContentTooLargeException {
if (content.length() > 480)
throw new ContentTooLargeException("Content must have less than 480 charaters!");
else {
try {
Tweet tweet = new Tweet();
tweet.setContent(content);
tweet.setPostTime(postTime);
em.persist(tweet);
return tweet;
} catch (Exception e) {
return null;
}
}
}
@Override
public java.util.List<Tweet> findAllSortedByTimeDesc() {
return em.createNamedQuery("Tweet.findAllSortedByTimeDesc").getResultList();
}
}
Cuando le envío cientos de solicitudes, el servidor JBoss 6 lanza esta excepción:
JBWEB000065: HTTP Status 500 - JBWEB000209: Session creation failed due to too many active sessions
JBWEB000309: type JBWEB000066: Exception report
JBWEB000068: message JBWEB000209: Session creation failed due to too many active sessions
JBWEB000069: description JBWEB000145: The server encountered an internal error that prevented it from fulfilling this request.
JBWEB000070: exception
javax.servlet.ServletException: JBWEB000209: Session creation failed due to too many active sessions
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
JBWEB000071: root cause
java.lang.IllegalStateException: JBWEB000209: Session creation failed due to too many active sessions
org.apache.catalina.session.StandardManager.createSession(StandardManager.java:297)
org.apache.catalina.connector.Request.doGetSession(Request.java:2651)
org.apache.catalina.connector.Request.getSession(Request.java:2357)
org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:790)
com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:157)
com.sun.faces.application.view.FaceletViewHandlingStrategy.getSession(FaceletViewHandlingStrategy.java:494)
com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:400)
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:124)
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:286)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
Mi pregunta es: ¿por qué el servidor crea demasiadas sesiones? Utilicé RequestScope y Stateless Bean, ¿cómo es que terminan en sesión? ¿Qué puedo hacer para superar esta situación? Si utilizo solo servlet y JSP, cuando hay demasiadas solicitudes, el servidor se ralentiza, pero al menos no se detiene así.