为什么 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&useSSL=false&cachePrepStmts=true&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()
获得了一个新连接!)。很可能你有连接池饥饿。
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&useSSL=false&cachePrepStmts=true&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()
获得了一个新连接!)。很可能你有连接池饥饿。