[
https://issues.jboss.org/browse/SEAMFACES-249?page=com.atlassian.jira.plu...
]
Bryn Cooke edited comment on SEAMFACES-249 at 8/8/12 4:33 AM:
--------------------------------------------------------------
In transaction phase listener a transaction is started at the render response phase.
{code:title=TransactionPhaseListener.java}
public void handleTransactionsBeforePhase(final PhaseEvent event) {
PhaseId phaseId = event.getPhaseId();
if (seamManagedTransactionStatus(phaseId)) {
if (phaseId == RENDER_RESPONSE) {
persistenceContexts.beforeRender();
begin(phaseId);
}
}
}
{code}
But then it is only closed if in the invoke application phase, faces context render
response is true or faces context response complete is true.
{code:title=TransactionPhaseListener.java}
public void handleTransactionsAfterPhase(final PhaseEvent event) {
PhaseId phaseId = event.getPhaseId();
if (seamManagedTransactionStatus(phaseId)) {
boolean commitTran = (phaseId == PhaseId.INVOKE_APPLICATION) ||
event.getFacesContext().getRenderResponse()
|| event.getFacesContext().getResponseComplete();
if (commitTran) {
commitOrRollback(phaseId); // we commit before destroying contexts,
// cos the contexts have the PC in them
}
}
}
{code}
Usually render response is set to true for get requests, but using Mojarra this is not the
case for views with parameters so the transaction is not committed:
{code:title=RestoreViewPhase.java:224}
ViewMetadata metadata = vdl.getViewMetadata(facesContext, viewId);
if (metadata != null) { // perhaps it's not supported
// and use it to create the ViewRoot. This will have, at most
// the UIViewRoot and its metadata facet.
viewRoot = metadata.createMetadataView(facesContext);
// Only skip to render response if there are no view parameters
Collection<UIViewParameter> params =
ViewMetadata.getViewParameters(viewRoot);
if (params.isEmpty()) {
facesContext.renderResponse();
}
}
{code}
was (Author: bryncooke):
In transaction phase listener a transaction is started at the render response phase.
TransactionPhaseListener.java
public void handleTransactionsBeforePhase(final PhaseEvent event) {
PhaseId phaseId = event.getPhaseId();
if (seamManagedTransactionStatus(phaseId)) {
if (phaseId == RENDER_RESPONSE) {
persistenceContexts.beforeRender();
begin(phaseId);
}
}
}
But then it is only closed if in the invoke application phase, faces context render
response is true or faces context response complete is true.
public void handleTransactionsAfterPhase(final PhaseEvent event) {
PhaseId phaseId = event.getPhaseId();
if (seamManagedTransactionStatus(phaseId)) {
boolean commitTran = (phaseId == PhaseId.INVOKE_APPLICATION) ||
event.getFacesContext().getRenderResponse()
|| event.getFacesContext().getResponseComplete();
if (commitTran) {
commitOrRollback(phaseId); // we commit before destroying contexts,
// cos the contexts have the PC in them
}
}
}
Usually render response is set to true for get requests, but using Mojarra this is not the
case for views with parameters so the transaction is not committed:
RestoreViewPhase.java:224
ViewMetadata metadata = vdl.getViewMetadata(facesContext, viewId);
if (metadata != null) { // perhaps it's not supported
// and use it to create the ViewRoot. This will have, at most
// the UIViewRoot and its metadata facet.
viewRoot = metadata.createMetadataView(facesContext);
// Only skip to render response if there are no view parameters
Collection<UIViewParameter> params =
ViewMetadata.getViewParameters(viewRoot);
if (params.isEmpty()) {
facesContext.renderResponse();
}
}
Transaction not closed when using view parameters
-------------------------------------------------
Key: SEAMFACES-249
URL:
https://issues.jboss.org/browse/SEAMFACES-249
Project: Seam Faces
Issue Type: Bug
Environment: Linux, Tomcat7, Mojarra 2.1.11, Seam Faces 3.1.0
Reporter: Bryn Cooke
When using the view parameters the transaction created by the TransactionPhaseListener in
the render response phase is not closed. This results in the transaction being marked as
close on commit and in our web site we run out of connections to the database.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see:
http://www.atlassian.com/software/jira