为什么 actionListener 只执行了四次?

Why actionListener is executed only four times?

1.-我在 tomcat 8 中使用带有 Primefaces 6.2 的 JSF,在 Mysql 中使用数据库。

2.-在文件 plantilla.xhtml 中有一个包含 p:menu 项的菜单,当我从 p:menu 导航到页面并单击 p:commandButton 时使用调用方法的 actionListener管理Bean。它只允许在应用程序停止前执行四次 actionlistener。

3.-当我调试proyect时,总是在我在这一行中第4次调试时停止:

con.closeAll(null, preparedStatement, con.getConexion()); 

最后,Web 应用程序停止,控制台没有显示任何内容。

context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JBS">
<Resource auth="Container" 
        driverClassName="com.mysql.jdbc.Driver" 
        name="jdbc/JBS" 
        maxActive="100"
        maxIdle="30"
        maxWait="10000"
        password="Armando#27" 
        type="javax.sql.DataSource" 
        url="jdbc:mysql://localhost:3306/jbs_servicios?autoReconnect=true&amp;useSSL=false&amp;cachePrepStmts=true&amp;useServerPrepStmts=true" 
        username="root"/>
</Context>

Conexion.java:

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource; 


public class Conexion {

public Connection getConexion() throws SQLException {
    Connection conn = null;
    DataSource dataSource = null;
    try {
        Context initContext = new InitialContext();
        Context envContext = (Context) initContext.lookup("java:/comp/env");
        dataSource = (DataSource) envContext.lookup("jdbc/JBS");

        if (dataSource != null) {

            conn = (Connection) dataSource.getConnection();
        } else {
            System.out.println("no hay dataSource");
        }

    } catch (NamingException e) {
        System.out.println("Error NamingException: " + e.getExplanation());
    }

    return conn;
}

public void closeAll(ResultSet rs, PreparedStatement pst, Connection con) {
    if (rs != null) {
        try {
            rs.close();
            System.out.println("Se cerro el resultset");
        } catch (SQLException ex) {
            System.err.println("Error al cerrar resultset: " + ex.getMessage());
        }
    }
    if (pst != null) {
        try {
            pst.close();
            System.out.println("Se cerro el preparedStatement");
        } catch (SQLException ex) {
            System.err.println("Error al cerrar preparedStatement: " + ex.getMessage());
        }
    }
    if (con != null) {
        try {
            con.close();
            System.out.println("Se cerro la conexion");
        } catch (SQLException ex) {
            System.err.println("Error al cerrar conexion: " + ex.getMessage());
        }
    }
}

}

plantilla.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
  xmlns:h="http://xmlns.jcp.org/jsf/html"

  xmlns:p="http://primefaces.org/ui">

<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <h:outputStylesheet name="./css/default.css"/>
    <h:outputStylesheet name="./css/cssLayout.css"/>
    <title>Facelets Template</title>
</h:head>

<h:body>
    <div id="top" class="top">
        <ui:insert name="top"></ui:insert>
        <p:outputLabel value="JB System" style="font-size: x-large; font-weight: bolder; margin-left: 10px;"/>
        <p:outputLabel value="Bienvenido: #{sesionMB.usuario.usuarioNombre}" style="float: right; margin-top:1%; margin-right: 3px;"/>
    </div>

    <div>
        <div id="left">
            <ui:insert name="left"></ui:insert>
            <div id="menuBar">
                <h:form>
                    <p:menu toggleable="true" style="width: 100%" >
                        <p:submenu label="Administración">
                            <p:menuitem value="Tipo de servicio" outcome="/pantallas/tipoServicio.xhtml" icon="fa fa-fw fa-book" />
                            <p:menuitem value="Tipo de bien" outcome="/pantallas/tipoBien.xhtml" icon="fa fa-fw fa-book"/>
                            <p:menuitem value="Usuarios" outcome="/pantallas/usuarios.xhtml" icon="fa fa-fw fa-user" />
                        </p:submenu>
                        <p:submenu label="Operación">
                            <p:menuitem value="Registrar servicio" outcome="/pantallas/agregarServicios.xhtml" icon="fa fa-fw fa-edit"/>
                        </p:submenu>
                        <p:submenu label="Consultas" rendered="false">
                            <p:menuitem value="Servicios"  icon="fa fa-list-ul" />
                        </p:submenu>
                    </p:menu>

                </h:form>
            </div>


        </div>
        <div id="content" class="center_content">
            <ui:insert name="content">Content</ui:insert>
        </div>
    </div>
</h:body>

4.-tipoBien.xhtml:

<ui:composition template="./../Template/plantilla.xhtml"
            xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
            xmlns:p="http://primefaces.org/ui"
            xmlns:h="http://xmlns.jcp.org/jsf/html"
            xmlns:f="http://xmlns.jcp.org/jsf/core">
<ui:define name="content">
    <h:form id="frmTipoBien">
       <p:growl id="growl" showDetail="false" sticky="false" />
        <p:panel id="pnlTipoBien" header="Tipo de bien">
            <p:panelGrid columns="5">
                <p:commandButton value="Agregar tipo de bien" icon="fa fa-plus" onclick="PF('dlgAgregaBien').show()"/>
                <p:commandButton value="Listar" icon="fa fa-list-ul" actionListener="#{tipoBienMB.cargaDatos()}" immediate="true" update="pnlTipoBien"/>
                <p:commandButton value="Exportar excel" icon="fa fa-file-excel-o" ajax="false" immediate="true" disabled="#{!tipoBienMB.dtTipoBien}">
                    <p:dataExporter type="xls" target="dtTipoBien" fileName="JBCatalogoBien"/>
                </p:commandButton>
            </p:panelGrid>
            <p:dataTable id="dtTipoBien" style="margin-top: 10px;" var="tipoBien" 
                         value="#{tipoBienMB.listaTipoBienes}" editable="true" paginator="true"
                         rows="10" rendered="#{tipoBienMB.dtTipoBien}">

                <p:ajax event="rowEdit" listener="#{tipoBienMB.onRowEditTipoBien}" update="frmTipoBien:growl"/>
                <p:column headerText="ID TIPO BIEN" style="width: 10%">
                    <h:outputText value="#{tipoBien.idTipoBien}"  />
                </p:column>

                <p:column headerText="BIEN" style="width: 30%">
                    <p:cellEditor>
                        <f:facet name="output"><h:outputText value="#{tipoBien.bien}" /></f:facet>
                        <f:facet name="input"><p:inputText value="#{tipoBien.bien}" maxlength="50"/></f:facet>
                    </p:cellEditor>
                </p:column>
                <p:column headerText="OBSERVACIONES" style="width: 30%">
                    <p:cellEditor>
                        <f:facet name="output"><h:outputText value="#{tipoBien.observaciones}" /></f:facet>
                        <f:facet name="input"><p:inputText value="#{tipoBien.observaciones}" maxlength="50"/></f:facet>
                    </p:cellEditor>
                </p:column>

                <p:column headerText="FECHA REGISTRO" style="width: 20%">
                    <h:outputText value="#{tipoBien.fechaRegistro}" />
                </p:column>
                <p:column headerText="ESTATUS" style="width: 10%">
                    <p:cellEditor>
                        <f:facet name="output"><h:outputText value="#{tipoBien.idEstatus==1?'Activo':'Inactivo'}" /></f:facet>
                        <f:facet name="input">
                            <p:selectOneMenu value="#{tipoBien.idEstatus}">
                                <f:selectItem itemLabel="ACTIVO" itemValue="1"/>
                                <f:selectItem itemLabel="INACTIVO" itemValue="0"/>
                            </p:selectOneMenu>
                        </f:facet>
                    </p:cellEditor>

                </p:column>
                <p:column  style="width:32px" exportable="false">
                    <p:rowEditor />
                </p:column>
            </p:dataTable>
        </p:panel>
        <p:dialog id="dlgAgregaBien" header="Agregar tipo de bien" widgetVar="dlgAgregaBien" resizable="false">
            <p:panelGrid columns="2">
                <p:outputLabel value="Descripción del bien" />
                <p:inputText value="#{tipoBienMB.tipoBien.bien}" maxlength="50" required="true" requiredMessage="Ingrese Descripción del bien"/>
                <p:outputLabel value="Observaciones" />
                <p:inputText value="#{tipoBienMB.tipoBien.observaciones}" maxlength="50" required="true" requiredMessage="Ingrese Observaciones"/>
                <p:outputLabel/>
                <p:commandButton actionListener="#{tipoBienMB.agregarTipoBien()}" value="agregar"  update="growl, pnlTipoBien" icon="fa fa-check" style="float: right"/>
            </p:panelGrid>
        </p:dialog>
    </h:form>
</ui:define>

CatalogosDAO.java:

public int guardaTipoServicio(TipoServicio kservicio, int idUsuario) {
    Conexion con = null;
    PreparedStatement preparedStatement = null;
    int regreso = 0;
    String query = "insert into kservicio (TipoServicio, FechaRegistro, idEstatus, idUsuario) values(?,sysdate(), 1, ?)";

    try {
        con = new Conexion();
        preparedStatement = con.getConexion().prepareStatement(query);
        preparedStatement.setString(1, kservicio.getTipoServicio());
        preparedStatement.setInt(2, idUsuario);
        regreso = preparedStatement.executeUpdate();

    } catch (SQLException ex) {
        System.out.println("catalogosDAO > guardaTipoServicio:  ERROR " + ex.getMessage());
    } finally {
        try {
            if(con != null){
                con.closeAll(null, preparedStatement, con.getConexion());   
            }

        } catch (SQLException ex) {
            System.out.println("Error al cerrar conexion: " + ex.getMessage());
        }
    }

    return regreso;
}

public List<TipoServicio> consultaTipoServicio() {
    Conexion con = new Conexion();
    PreparedStatement preparedStatement = null;
    ResultSet rs = null;
    List<TipoServicio> listaTipoServicio = new ArrayList<>();
    TipoServicio tipoServicio = null;
    String query = "select ks.TipoServicio, \n"
            + "    ks.IdTipoServicio, \n"
            + "       ks.FechaRegistro, \n"
            + "       ks.IdEstatus,\n"
            + "       IF(ks.IdEstatus = 1, 'Activo', 'Inactivo') AS Estatus \n"
            + " from kservicio as ks\n";

    try {
        preparedStatement = con.getConexion().prepareStatement(query);
        rs = preparedStatement.executeQuery();
        while (rs.next()) {
            tipoServicio = new TipoServicio();
            tipoServicio.setTipoServicio(rs.getString("TipoServicio"));
            tipoServicio.setIdTipoServicio(rs.getInt("IdTipoServicio"));
            tipoServicio.setFechaRegistro(rs.getString("FechaRegistro"));
            tipoServicio.setIdEstatus(rs.getInt("IdEstatus"));
            tipoServicio.setDescripcionEstatus(rs.getString("Estatus"));

            listaTipoServicio.add(tipoServicio);
        }

    } catch (SQLException ex) {
        System.err.println("ERROR: AdministracionDAO > consultaRegistros()-- " + ex.getMessage());
    } finally {

        try {
        con.closeAll(rs, preparedStatement, con.getConexion());
        } catch (SQLException ex) {
            System.err.println("ERROR al cerrar resultset, preparedStatement o conexion >" + ex.getMessage());
        }
    }
    return listaTipoServicio;
}

随叫随到

con.closeAll(null, preparedStatement, con.getConexion()); 

您尝试关闭一个连接,但同时又恢复了一个连接(con.getConnexion() 获得了一个新连接!)。很可能你有连接池饥饿。