Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Problemas com servidor REST

Senhores,

Boa tarde, desenvolvi um servidor REST para servir uma aplicação de comandas em tablets. Nessa aplicação tenho um POST no resource que chama um método no DAO que grava as comanda e os itens. Quando um garçom clica no botão que chama esse metodo sozinho, tudo funciona normalmente, porém se 2 garçons clicarem ao mesmo tempo, tenho problemas na gravação de uma das comandas. Notei que se eu não fechar a conexão com o banco, o problema não acontece, porém eu gero milhões de conexões com o banco. Implementei um pool de conexões dbcp e não resolveu.

O que devo fazer?

10 respostas

Boa tarde Jose,

Você esta lidando bem com as transações?

Sua aplicação é com JPA? Caso estiver, você pode dar uma olhada em versionamento de entidades, com Optimistic Locking.

Desculpa não descrever isso. Não estou usando JPA. Estou usando JDBC puro com banco de dados MySQL.

Segue minha classe DAO: '''public class ComandaDAO extends ConnectionFactory { static Logger logger = Logger.getLogger("lopes"); Statement stmt;

private static ComandaDAO instance;

public static ComandaDAO getInstance(){ if(instance==null){ instance= new ComandaDAO(); } return instance; }

public void GravarAlteracoesComanda(Comanda comanda) throws Exception { try { Connection conn = new PoolConnectionDB().getConexaoRAC(); stmt = conn.createStatement(); if(!comanda.isCancelada()){ if(comanda.isNovaComanda()){ stmt.executeUpdate("insert into comanda (id_comanda,data_venda,valor_total,vr_total_itens," + "vr_tx_servico,tx_servico,localizacao) values " + "('" + comanda.getNumComanda()+ "','" + ConverterDatasDecimais.converterDataHoraGravar(new Date()) + "','" + ConverterDatasDecimais.converterBigDecimalString(comanda.getValorTotal()) +"','" + ConverterDatasDecimais.converterBigDecimalString(comanda.getVrTotalItens()) +"','" + ConverterDatasDecimais.converterBigDecimalString(comanda.getVrTxServico()) +"','" + ConverterDatasDecimais.converterBooleanParaInt(comanda.isTxServico()) +"','" + comanda.getLocalizacao() + "')"); comanda.setId(findIdComandaByNumero(comanda.getNumComanda())); } for (ComandaItem item : comanda.getItens()) { if(item.isNovoItem()){ int idGarcom=0; String nomeGarcom=""; if(item.getGarcom()!=null){ idGarcom=item.getGarcom().getIdFuncionario(); nomeGarcom=item.getGarcom().getNome(); } String scriptInsertItem="insert into comanda_item (data_criacao,fracionado_nome_produto,valor_total,id_fracionado," + "id_item,impresso,item_cancelado,observacao,quantidade,tx_servico,valor_unitario,vr_tx_servico," + "id_garcom,nome_garcom,id_produto,id_opcao_combo,comanda_id) values " + "('" + item.getDataCriacao() + "','" + item.getFracionadoNomeProduto() + "','" + ConverterDatasDecimais.converterBigDecimalString(item.getValorTotal()) +"','" + item.getIdFracionado() +"','" + item.getIdItem() +"','" + ConverterDatasDecimais.converterBooleanParaInt(item.isImpresso())+"','" + ConverterDatasDecimais.converterBooleanParaInt(item.isItemCancelado())+"','" + item.getObservacao() +"','" + item.getQuantidade() +"','" + ConverterDatasDecimais.converterBooleanParaInt(item.isTxServico())+"','" + ConverterDatasDecimais.converterBigDecimalString(item.getValorUnitario()) +"','" + ConverterDatasDecimais.converterBigDecimalString(item.getVrTxServico()) +"','" + idGarcom +"','"+ nomeGarcom +"','" + item.getProduto().getIdProduto() +"','" + item.getIdOpcaoCombo() +"','" + comanda.getId() + "')"; stmt.executeUpdate(scriptInsertItem); }else{ if(item.isItemCancelado()){ stmt.executeUpdate("UPDATE comanda_item SET item_cancelado='1' " + "WHERE id='"+item.getId()+"'"); } } } } stmt.executeUpdate("UPDATE comanda SET impresso='0' " + "WHERE id='"+comanda.getId()+"'"); //FechaConexao(conn, stmt, null); //new PoolConnectionDB().liberarRecursosBD(null, null, conn); comanda=findComandaByNumero(comanda.getNumComanda(),conn); new FerramentasComanda().calculaTotaisComanda(comanda); AtualizarTotaisComanda(comanda,conn); } catch (SQLException e) { //trata os erros SQL logger.error(e); } }

public void solicitarConta(int idComanda) throws Exception { try { Connection conn = createConexao(); stmt = conn.createStatement(); stmt.executeUpdate("UPDATE comanda SET conta_solicitada='1' " + "WHERE id='"+idComanda+"'"); FechaConexao(conn, stmt, null); } catch (SQLException e) { //trata os erros SQL logger.error(e); } }

public Comanda findComandaByNumero(int numComanda,Connection conexao){ Comanda comanda = null; try { Connection conn; if(conexao==null){ conn= new PoolConnectionDB().getConexaoRAC(); }else{ conn=conexao; } stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("Select FROM comanda " + "WHERE id_comanda ='" + numComanda + "'"); if (rs.next()) { comanda = new Comanda(); comanda.setId(rs.getInt("id")); comanda.setContaSolicitada(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("conta_solicitada"))); comanda.setImpresso(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("impresso"))); comanda.setNovaComanda(false); comanda.setNumComanda(rs.getInt("id_comanda")); comanda.setDataVenda(rs.getTimestamp("data_venda")); comanda.setValorTotal(rs.getBigDecimal("valor_total")); comanda.setVrTotalItens(rs.getBigDecimal("vr_total_itens")); comanda.setVrTxServico(rs.getBigDecimal("vr_tx_servico")); comanda.setTxServico(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("tx_servico"))); comanda.setLocalizacao(rs.getString("localizacao")); comanda.setItens(new ArrayList<>()); ResultSet rs1 = stmt.executeQuery("Select FROM comanda_item " + "WHERE comanda_id='" + comanda.getId() + "'"); while(rs1.next()){ ComandaItem comandaItem=new ComandaItem(); comandaItem.setId(rs1.getInt("id")); comandaItem.setDataCriacao(rs1.getString("data_criacao")); comandaItem.setFracionadoNomeProduto(rs1.getString("fracionado_nome_produto")); comandaItem.setIdFracionado(rs1.getInt("id_fracionado")); comandaItem.setIdItem(rs1.getInt("id_item")); comandaItem.setImpresso(ConverterDatasDecimais.converterIntParaBoolean(rs1.getInt("impresso"))); comandaItem.setItemCancelado(ConverterDatasDecimais.converterIntParaBoolean(rs1.getInt("item_cancelado"))); comandaItem.setTxServico(ConverterDatasDecimais.converterIntParaBoolean(rs1.getInt("tx_servico"))); comandaItem.setObservacao(rs1.getString("observacao")); comandaItem.setQuantidade(rs1.getBigDecimal("quantidade")); comandaItem.setValorUnitario(rs1.getBigDecimal("valor_unitario")); comandaItem.setValorTotal(rs1.getBigDecimal("valor_total")); comandaItem.setVrTxServico(rs1.getBigDecimal("vr_tx_servico")); if(rs1.getInt("id_garcom")==0){ Funcionario funcionario=new Funcionario(); funcionario.setNome(""); funcionario.setIdFuncionario(0); comandaItem.setGarcom(funcionario); }else{ comandaItem.setGarcom(new FuncionarioDAO().findGarcomById(rs1.getInt("id_garcom"))); } comandaItem.setProduto(new ProdutoDAO().findProdutoById(rs1.getInt("id_produto"))); comandaItem.setIdOpcaoCombo(rs1.getInt("id_opcao_combo")); comandaItem.setIdComanda(comanda.getId()); comanda.getItens().add(comandaItem); } }else{ comanda=new FerramentasComanda().novaComandaCorrente(comanda); comanda.setNumComanda(numComanda); } //FechaConexao(conn, stmt, rs); if(conexao==null){ new PoolConnectionDB().liberarRecursosBD(rs, null, conn); } } catch (SQLException e) { //trata os erros SQL logger.error(e); return null; } catch (Exception ex) { logger.error(ex); } return comanda; }

public void CancelamentoItemComanda(ComandasCancelamentoSomenteItens item) throws Exception { try { Connection conn = createConexao(); stmt = conn.createStatement(); stmt.executeUpdate("insert into comandas_cancelamento_somente_itens (num_comanda,id_produto,id_fiscal," + "nome_fiscal,qtd,valor_unitario,valor_total,justificativa,data_hora_cancelamento) values " + "('" + item.getNumComanda()+ "','" + item.getProduto().getIdProduto()+ "','" + item.getIdFiscal() + "','"+ item.getNomeFiscal()+ "','" + item.getQtd()+ "','" + item.getValorUnitario() + "','" + item.getValorTotal()+ "','" + item.getJustificativa() + "','" + ConverterDatasDecimais.converterDataHoraGravar(item.getDataHoraCancelamento()) + "')"); FechaConexao(conn, stmt, null); } catch (SQLException e) { //trata os erros SQL logger.error(e); } }

public void AtualizarTotaisComanda(Comanda comanda,Connection conn) throws Exception { try { stmt = conn.createStatement(); stmt.executeUpdate("UPDATE comanda SET valor_total='"+ConverterDatasDecimais.converterBigDecimalString(comanda.getValorTotal())+"'," + "vr_total_itens='"+ConverterDatasDecimais.converterBigDecimalString(comanda.getVrTotalItens())+"'," + "vr_tx_servico='"+ConverterDatasDecimais.converterBigDecimalString(comanda.getVrTxServico())+"'," + "tx_servico='"+ConverterDatasDecimais.converterBooleanParaInt(comanda.isTxServico())+"'," + "localizacao='"+comanda.getLocalizacao()+"' " + "WHERE id='"+comanda.getId()+"'"); //FechaConexao(conn, stmt, null); //new PoolConnectionDB().liberarRecursosBD(null, null, conn); } catch (SQLException e) { //trata os erros SQL logger.error(e); } }

public void apagarItensTransferidos(ArrayList itens){ try { Connection conn = createConexao(); stmt = conn.createStatement(); for (ComandaItem item : itens) { stmt.executeUpdate("DELETE FROM comanda_item " + "WHERE id='" + item.getId() + "'"); } FechaConexao(conn, stmt, null); } catch (SQLException e) { //trata os erros SQL logger.error(e); } catch (Exception ex) { logger.error(ex); } }

public ArrayList listarComandasAbertas(){ ArrayList comandasAbertas = new ArrayList<>(); try { Connection conn = createConexao(); stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("Select * FROM comanda ORDER BY id_comanda ASC"); while (rs.next()) { Comanda comanda = new Comanda(); comanda.setId(rs.getInt("id")); comanda.setContaSolicitada(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("conta_solicitada"))); comanda.setImpresso(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("impresso"))); comanda.setNovaComanda(false); comanda.setNumComanda(rs.getInt("id_comanda")); comanda.setDataVenda(rs.getTimestamp("data_venda")); comanda.setValorTotal(rs.getBigDecimal("valor_total")); comanda.setVrTotalItens(rs.getBigDecimal("vr_total_itens")); comanda.setVrTxServico(rs.getBigDecimal("vr_tx_servico")); comanda.setTxServico(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("tx_servico"))); comanda.setLocalizacao(rs.getString("localizacao")); comandasAbertas.add(comanda); } FechaConexao(conn, stmt, rs); } catch (SQLException e) { //trata os erros SQL logger.error(e); return null; } catch (Exception ex) { logger.error(ex); } return comandasAbertas; }

public ArrayList findItensByIdComanda(int idComanda){ ArrayList itensComanda = new ArrayList<>(); try { Connection conn = createConexao(); stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("Select * FROM comanda_item where comanda_id='"+idComanda+"'"); while (rs.next()) { ComandaItem comandaItem=new ComandaItem(); comandaItem.setId(rs.getInt("id")); comandaItem.setDataCriacao(rs.getString("data_criacao")); comandaItem.setFracionadoNomeProduto(rs.getString("fracionado_nome_produto")); comandaItem.setIdFracionado(rs.getInt("id_fracionado")); comandaItem.setIdItem(rs.getInt("id_item")); comandaItem.setImpresso(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("impresso"))); comandaItem.setItemCancelado(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("item_cancelado"))); comandaItem.setTxServico(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("tx_servico"))); comandaItem.setObservacao(rs.getString("observacao")); comandaItem.setQuantidade(rs.getBigDecimal("quantidade")); comandaItem.setValorUnitario(rs.getBigDecimal("valor_unitario")); comandaItem.setValorTotal(rs.getBigDecimal("valor_total")); comandaItem.setVrTxServico(rs.getBigDecimal("vr_tx_servico")); if(rs.getInt("id_garcom")==0){ Funcionario funcionario=new Funcionario(); funcionario.setNome(""); funcionario.setIdFuncionario(0); comandaItem.setGarcom(funcionario); }else{ comandaItem.setGarcom(new FuncionarioDAO().findGarcomById(rs.getInt("id_garcom"))); } comandaItem.setProduto(new ProdutoDAO().findProdutoById(rs.getInt("id_produto"))); comandaItem.setIdOpcaoCombo(rs.getInt("id_opcao_combo")); comandaItem.setIdComanda(idComanda); itensComanda.add(comandaItem); } FechaConexao(conn, stmt, rs); } catch (SQLException e) { //trata os erros SQL logger.error(e); return null; } catch (Exception ex) { logger.error(ex); } return itensComanda; }

public int findIdComandaByNumero(int numComanda){ int idComanda=0; try {

Connection conn = createConexao(); stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("SELECT id FROM comanda WHERE id_comanda='"+numComanda+"'"); if (rs.next()) { idComanda=rs.getInt("id"); } } catch (SQLException e) { //trata os erros SQL logger.error(e); } catch (Exception ex) { logger.error(ex); } return idComanda; } }'''

public class ComandaDAO extends ConnectionFactory {
    static Logger logger = Logger.getLogger("lopes");
    Statement stmt;

    private static ComandaDAO instance;

    public static ComandaDAO getInstance(){
        if(instance==null){
            instance= new ComandaDAO();
        }
        return instance;
    }

    public void GravarAlteracoesComanda(Comanda comanda) throws Exception {
        try {
            Connection conn = new PoolConnectionDB().getConexaoRAC();
            stmt = conn.createStatement();
            if(!comanda.isCancelada()){
                if(comanda.isNovaComanda()){
                    stmt.executeUpdate("insert into comanda (id_comanda,data_venda,valor_total,vr_total_itens,"
                            + "vr_tx_servico,tx_servico,localizacao) values "
                            + "('" + comanda.getNumComanda()+ "','" + ConverterDatasDecimais.converterDataHoraGravar(new Date()) + "','"
                            + ConverterDatasDecimais.converterBigDecimalString(comanda.getValorTotal()) +"','"
                            + ConverterDatasDecimais.converterBigDecimalString(comanda.getVrTotalItens()) +"','"
                            + ConverterDatasDecimais.converterBigDecimalString(comanda.getVrTxServico()) +"','"
                            + ConverterDatasDecimais.converterBooleanParaInt(comanda.isTxServico()) +"','"
                            + comanda.getLocalizacao() + "')");
                    comanda.setId(findIdComandaByNumero(comanda.getNumComanda()));
                }
                for (ComandaItem item : comanda.getItens()) {
                    if(item.isNovoItem()){
                        int idGarcom=0;
                        String nomeGarcom="";
                        if(item.getGarcom()!=null){
                            idGarcom=item.getGarcom().getIdFuncionario();
                            nomeGarcom=item.getGarcom().getNome();
                        }
                        String scriptInsertItem="insert into comanda_item (data_criacao,fracionado_nome_produto,valor_total,id_fracionado,"
                            + "id_item,impresso,item_cancelado,observacao,quantidade,tx_servico,valor_unitario,vr_tx_servico,"
                            + "id_garcom,nome_garcom,id_produto,id_opcao_combo,comanda_id) values "
                            + "('" + item.getDataCriacao() + "','"
                            + item.getFracionadoNomeProduto() + "','"
                            + ConverterDatasDecimais.converterBigDecimalString(item.getValorTotal()) +"','"
                            + item.getIdFracionado() +"','"
                            + item.getIdItem() +"','"
                            + ConverterDatasDecimais.converterBooleanParaInt(item.isImpresso())+"','"
                            + ConverterDatasDecimais.converterBooleanParaInt(item.isItemCancelado())+"','"
                            + item.getObservacao() +"','"
                            + item.getQuantidade() +"','"
                            + ConverterDatasDecimais.converterBooleanParaInt(item.isTxServico())+"','"
                            + ConverterDatasDecimais.converterBigDecimalString(item.getValorUnitario()) +"','"
                            + ConverterDatasDecimais.converterBigDecimalString(item.getVrTxServico()) +"','"
                            + idGarcom +"','"+ nomeGarcom +"','"
                            + item.getProduto().getIdProduto() +"','"
                            + item.getIdOpcaoCombo() +"','"
                            + comanda.getId() + "')";
                        stmt.executeUpdate(scriptInsertItem);
                    }else{
                        if(item.isItemCancelado()){
                            stmt.executeUpdate("UPDATE comanda_item SET item_cancelado='1' "
                                + "WHERE id='"+item.getId()+"'");
                        }
                    }
                }
            }
            stmt.executeUpdate("UPDATE comanda SET impresso='0' "
                            + "WHERE id='"+comanda.getId()+"'");
            //FechaConexao(conn, stmt, null);
            //new PoolConnectionDB().liberarRecursosBD(null, null, conn);
            comanda=findComandaByNumero(comanda.getNumComanda(),conn);
            new FerramentasComanda().calculaTotaisComanda(comanda);
            AtualizarTotaisComanda(comanda,conn);
        } catch (SQLException e) { //trata os erros SQL
            logger.error(e);
        }
    }



    public void solicitarConta(int idComanda) throws Exception {
        try {
            Connection conn = createConexao();
            stmt = conn.createStatement();
            stmt.executeUpdate("UPDATE comanda SET conta_solicitada='1' "
                            + "WHERE id='"+idComanda+"'");
            FechaConexao(conn, stmt, null);
        } catch (SQLException e) { //trata os erros SQL
            logger.error(e);
        }
    }

    public Comanda findComandaByNumero(int numComanda,Connection conexao){
        Comanda comanda = null;
        try {
            Connection conn;
            if(conexao==null){
                conn= new PoolConnectionDB().getConexaoRAC();
            }else{
                conn=conexao;
            }
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("Select * FROM comanda "
                    + "WHERE id_comanda ='" + numComanda + "'");
            if (rs.next()) {
                comanda = new Comanda();
                comanda.setId(rs.getInt("id"));
                comanda.setContaSolicitada(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("conta_solicitada")));
                comanda.setImpresso(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("impresso")));
                comanda.setNovaComanda(false);
                comanda.setNumComanda(rs.getInt("id_comanda"));
                comanda.setDataVenda(rs.getTimestamp("data_venda"));
                comanda.setValorTotal(rs.getBigDecimal("valor_total"));
                comanda.setVrTotalItens(rs.getBigDecimal("vr_total_itens"));
                comanda.setVrTxServico(rs.getBigDecimal("vr_tx_servico"));
                comanda.setTxServico(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("tx_servico")));
                comanda.setLocalizacao(rs.getString("localizacao"));
                comanda.setItens(new ArrayList<>());
                ResultSet rs1 = stmt.executeQuery("Select * FROM comanda_item "
                    + "WHERE comanda_id='" + comanda.getId() + "'");
                while(rs1.next()){
                    ComandaItem comandaItem=new ComandaItem();
                    comandaItem.setId(rs1.getInt("id"));
                    comandaItem.setDataCriacao(rs1.getString("data_criacao"));
                    comandaItem.setFracionadoNomeProduto(rs1.getString("fracionado_nome_produto"));
                    comandaItem.setIdFracionado(rs1.getInt("id_fracionado"));
                    comandaItem.setIdItem(rs1.getInt("id_item"));
                    comandaItem.setImpresso(ConverterDatasDecimais.converterIntParaBoolean(rs1.getInt("impresso")));
                    comandaItem.setItemCancelado(ConverterDatasDecimais.converterIntParaBoolean(rs1.getInt("item_cancelado")));
                    comandaItem.setTxServico(ConverterDatasDecimais.converterIntParaBoolean(rs1.getInt("tx_servico")));
                    comandaItem.setObservacao(rs1.getString("observacao"));
                    comandaItem.setQuantidade(rs1.getBigDecimal("quantidade"));
                    comandaItem.setValorUnitario(rs1.getBigDecimal("valor_unitario"));
                    comandaItem.setValorTotal(rs1.getBigDecimal("valor_total"));
                    comandaItem.setVrTxServico(rs1.getBigDecimal("vr_tx_servico"));
                    if(rs1.getInt("id_garcom")==0){
                        Funcionario funcionario=new Funcionario();
                        funcionario.setNome("");
                        funcionario.setIdFuncionario(0);
                        comandaItem.setGarcom(funcionario);
                    }else{
                        comandaItem.setGarcom(new FuncionarioDAO().findGarcomById(rs1.getInt("id_garcom")));
                    }
                    comandaItem.setProduto(new ProdutoDAO().findProdutoById(rs1.getInt("id_produto")));
                    comandaItem.setIdOpcaoCombo(rs1.getInt("id_opcao_combo"));
                    comandaItem.setIdComanda(comanda.getId());
                    comanda.getItens().add(comandaItem);
                }
            }else{
                comanda=new FerramentasComanda().novaComandaCorrente(comanda);
                comanda.setNumComanda(numComanda);
            }
            //FechaConexao(conn, stmt, rs);
            if(conexao==null){
                new PoolConnectionDB().liberarRecursosBD(rs, null, conn);
            }
        } catch (SQLException e) { //trata os erros SQL
            logger.error(e);
            return null;
        } catch (Exception ex) {
            logger.error(ex);
        }
        return comanda;
    }

    public void CancelamentoItemComanda(ComandasCancelamentoSomenteItens item) throws Exception {
        try {
            Connection conn = createConexao();
            stmt = conn.createStatement();
            stmt.executeUpdate("insert into comandas_cancelamento_somente_itens (num_comanda,id_produto,id_fiscal,"
                    + "nome_fiscal,qtd,valor_unitario,valor_total,justificativa,data_hora_cancelamento) values "
                    + "('" + item.getNumComanda()+ "','" + item.getProduto().getIdProduto()+ "','"
                    + item.getIdFiscal() + "','"+ item.getNomeFiscal()+ "','" + item.getQtd()+ "','"
                    + item.getValorUnitario() + "','" + item.getValorTotal()+ "','"
                    + item.getJustificativa() + "','"
                    + ConverterDatasDecimais.converterDataHoraGravar(item.getDataHoraCancelamento()) + "')");
            FechaConexao(conn, stmt, null);
        } catch (SQLException e) { //trata os erros SQL
            logger.error(e);
        }
    }

    public void AtualizarTotaisComanda(Comanda comanda,Connection conn) throws Exception {
        try {
            stmt = conn.createStatement();
            stmt.executeUpdate("UPDATE comanda SET valor_total='"+ConverterDatasDecimais.converterBigDecimalString(comanda.getValorTotal())+"',"
                            + "vr_total_itens='"+ConverterDatasDecimais.converterBigDecimalString(comanda.getVrTotalItens())+"',"
                            + "vr_tx_servico='"+ConverterDatasDecimais.converterBigDecimalString(comanda.getVrTxServico())+"',"
                            + "tx_servico='"+ConverterDatasDecimais.converterBooleanParaInt(comanda.isTxServico())+"',"
                            + "localizacao='"+comanda.getLocalizacao()+"' "
                            + "WHERE id='"+comanda.getId()+"'");
            //FechaConexao(conn, stmt, null);
            //new PoolConnectionDB().liberarRecursosBD(null, null, conn);
        } catch (SQLException e) { //trata os erros SQL
            logger.error(e);
        }
    }

    public void apagarItensTransferidos(ArrayList<ComandaItem> itens){
        try {
            Connection conn = createConexao();
            stmt = conn.createStatement();
            for (ComandaItem item : itens) {
                stmt.executeUpdate("DELETE FROM comanda_item "
                        + "WHERE id='" + item.getId() + "'");
            }
            FechaConexao(conn, stmt, null);
        } catch (SQLException e) { //trata os erros SQL
            logger.error(e);
        } catch (Exception ex) {
            logger.error(ex);
        }
    }

    public ArrayList<Comanda> listarComandasAbertas(){
        ArrayList<Comanda> comandasAbertas = new ArrayList<>();
        try {
            Connection conn = createConexao();
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("Select * FROM comanda ORDER BY id_comanda ASC");
            while (rs.next()) {
                Comanda comanda = new Comanda();
                comanda.setId(rs.getInt("id"));
                comanda.setContaSolicitada(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("conta_solicitada")));
                comanda.setImpresso(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("impresso")));
                comanda.setNovaComanda(false);
                comanda.setNumComanda(rs.getInt("id_comanda"));
                comanda.setDataVenda(rs.getTimestamp("data_venda"));
                comanda.setValorTotal(rs.getBigDecimal("valor_total"));
                comanda.setVrTotalItens(rs.getBigDecimal("vr_total_itens"));
                comanda.setVrTxServico(rs.getBigDecimal("vr_tx_servico"));
                comanda.setTxServico(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("tx_servico")));
                comanda.setLocalizacao(rs.getString("localizacao"));
                comandasAbertas.add(comanda);
            }
            FechaConexao(conn, stmt, rs);
        } catch (SQLException e) { //trata os erros SQL
            logger.error(e);
            return null;
        } catch (Exception ex) {
            logger.error(ex);
        }
        return comandasAbertas;
    }

    public ArrayList<ComandaItem> findItensByIdComanda(int idComanda){
        ArrayList<ComandaItem> itensComanda = new ArrayList<>();
        try {
            Connection conn = createConexao();
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("Select * FROM comanda_item where comanda_id='"+idComanda+"'");
            while (rs.next()) {
                ComandaItem comandaItem=new ComandaItem();
                comandaItem.setId(rs.getInt("id"));
                comandaItem.setDataCriacao(rs.getString("data_criacao"));
                comandaItem.setFracionadoNomeProduto(rs.getString("fracionado_nome_produto"));
                comandaItem.setIdFracionado(rs.getInt("id_fracionado"));
                comandaItem.setIdItem(rs.getInt("id_item"));
                comandaItem.setImpresso(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("impresso")));
                comandaItem.setItemCancelado(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("item_cancelado")));
                comandaItem.setTxServico(ConverterDatasDecimais.converterIntParaBoolean(rs.getInt("tx_servico")));
                comandaItem.setObservacao(rs.getString("observacao"));
                comandaItem.setQuantidade(rs.getBigDecimal("quantidade"));
                comandaItem.setValorUnitario(rs.getBigDecimal("valor_unitario"));
                comandaItem.setValorTotal(rs.getBigDecimal("valor_total"));
                comandaItem.setVrTxServico(rs.getBigDecimal("vr_tx_servico"));
                if(rs.getInt("id_garcom")==0){
                    Funcionario funcionario=new Funcionario();
                    funcionario.setNome("");
                    funcionario.setIdFuncionario(0);
                    comandaItem.setGarcom(funcionario);
                }else{
                    comandaItem.setGarcom(new FuncionarioDAO().findGarcomById(rs.getInt("id_garcom")));
                }
                comandaItem.setProduto(new ProdutoDAO().findProdutoById(rs.getInt("id_produto")));
                comandaItem.setIdOpcaoCombo(rs.getInt("id_opcao_combo"));
                comandaItem.setIdComanda(idComanda);
                itensComanda.add(comandaItem);
            }
            FechaConexao(conn, stmt, rs);
        } catch (SQLException e) { //trata os erros SQL
            logger.error(e);
            return null;
        } catch (Exception ex) {
            logger.error(ex);
        }
        return itensComanda;
    }

    public int findIdComandaByNumero(int numComanda){
        int idComanda=0;
        try {

            Connection conn = createConexao();
            stmt = conn.createStatement();

            ResultSet rs = stmt.executeQuery("SELECT id FROM comanda WHERE id_comanda='"+numComanda+"'");
            if (rs.next()) {
                idComanda=rs.getInt("id");
            }
        } catch (SQLException e) { //trata os erros SQL
            logger.error(e);
        } catch (Exception ex) {
            logger.error(ex);
        }
        return idComanda;
    }
}

Nossa, consigo ver a alegria de quem for realizar as manutenções :D

José, você pode tentar conseguir o optimistic locking com jdbc também.

Obrigado Douglas, vou pesquisar sobre o assunto.

Pessoal, se alguém tiver como me dar um exemplo disso, pois estou pesquisando e só encontro uso com o Hibernate.

Jose, tenho duas referencias aqui, espero que ajude.

https://dzone.com/articles/jdbc-faq-transactions

http://www.marcobehler.com/make-it-so-java-db-connections-and-transactions-html/

solução!

Pessoal, achei o problema.

Resolvi declarando o Statement stmt; método a método e não na classe como eu estava fazendo antes.

Spring deve ajudá-lo. Você precisa mesmo usar JDBC puro?

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html

Tem como integrar Spring + Hibernate + MySQL.

Boa tarde Douglas,

Na verdade já fiz a tentativa de trabalhar com o Hibernate e até tenho alguns projetos rodando com ele, porém tive problemas de performance enormes que não tive tempo de pesquisar para resolver.

Me sinto mais seguro com o JDBC puro, mas vou voltar a estudar o assunto no futuro.