Conexão com o banco cai, alguem sabe o que posso faze rpra melhorar o codigo?

12 respostas
pfusco

Olá Amigos,

Estou com um problemão com um sisteminha pra emissão de pedidos que criei pra empresa onde faço estagio, SOU NOVATO COM JAVA e não sei o que faço para melhorar meu codigo.
Para que as conexões com o banco não são encerradas e isso vai entupindo a maquina do banco fazendo com o que o sistema caia alguem pode me dar uma luz???

Desde ja agradeço abaixo vou fixar o codigo pra vc´s darem uma olhada.

CONEXÃO COM O BANCO (ORACLE)

public boolean Conecta() {

try {

String driverOracle = “oracle.jdbc.driver.OracleDriver”;

Class.forName(driverOracle);

String serverOracle = NUMERO_IP: PORTA;

String sidOracle = “orcl”;

String urlOracle = jdbc:oracle:thin:@ + serverOracle + : + sidOracle;

String userOracle = “USUARIO”;

String paswOracle = “SENHA”;

connectOracle = DriverManager.getConnection(urlOracle, userOracle, paswOracle);

stmtOracle = connectOracle.createStatement();

}
catch (ClassNotFoundException e) {
  return false;
}
catch (SQLException e) {
      return false;      
}

return true;

}

ABAIXO 2 MODELOS DE MINHAS CLASSES COM O BANCO DE DADOS.

public ResultSet capaFaturados(String clientei, String clientef, String datai, String dataf, int repres, int grupo, String empresa) {
    try {
        if (!conexao.Conecta()) return null;
        String comando = "";
             comando = "SELECT t$ndte$l, t$ndoc$l, t$nser$l, t$demd$l, t$draa$l, t$nref$l " +
                "FROM ttdfat937"+empresa+" " +
                "WHERE ttdfat937"+empresa+".t$ndte$l between to_date('"+datai+"','dd/mm/yyyy') " +
                "AND to_date('"+dataf+"','dd/mm/yyyy') " +
                "AND t$ntpn$l = 1 " +               //Venda
                "AND t$demd$l between '"+clientei+"' AND '"+clientef+"' "+
                "AND t$nsta$l between 2 AND 3 " +   //Impressa e Liberada
                "AND t$nori$l between 1 AND 2 " +   //Manual e Pedido
                "AND t$npaf$l <> 'INC' " +
                "AND t$npaf$l <> 'IND' " +
                "ORDER BY t$demd$l, t$ndoc$l";
        resultado = conexao.stmtOracle.executeQuery(comando);
    }
    catch(SQLException e){
        return null;
    }
    return resultado;
}
    
public ResultSet linhaFaturados(int nref, String empresa) {
    try {
        if (!conexao.Conecta()) return null;
        String comando = "SELECT t$norn$l, t$npon$l, t$iitm$l, t$ipel$l, t$iprt$l, t$pval$l, t$ditm$o, t$ddim$o, "+
                         "t$icuq$l, t$iqua$l, t$idsc$l, t$dalt$o, t$idsc$l, t$clot$o, t$iitm$l, t$clot$o " +
                         "FROM ttdfat938"+empresa+" " +
                         "WHERE t$nref$l = "+nref+" " +
                         "ORDER BY t$norn$l, t$npon$l";
        resultado = conexao.stmtOracle.executeQuery(comando);
    }
    catch(SQLException e) {
        return null;
    }
    return resultado;
}

UMA DAS PAGINAS DO SISTEMINHA.

<%<a class="mention" href="/u/page">@page</a> import=… %>

<%

Usuarios usuarios = new Usuarios();

Faturamento faturamento = new Faturamento();

PedidoBaan pedidobaan = new PedidoBaan();

Dimensoes dimensoes = new Dimensoes();

GrupoItem grupoitem = new GrupoItem();

DecimalFormat formatador  = new DecimalFormat();

formatador.applyPattern("###,##0.00;(###,##0.00)");

SimpleDateFormat formatData = new SimpleDateFormat(dd/MM/yyyy);
String  usuario = "",
        senha = "";
int repres = usuarios.buscaRepresentante(usuario);
int grupo = usuarios.buscaGrupoDoUsuario(usuario);
String	datai = request.getParameter("datai"),
	dataf = request.getParameter("dataf"),
	clientei = request.getParameter("clientei"),
	clientef = request.getParameter("clientef"),
            empresa = request.getParameter("empresa");

        ResultSet resultCapa = faturamento.capaFaturados(clientei, clientef, datai, dataf, repres, grupo, empresa);
        ResultSet resultLinha = null;
        String  lote = "", dimensao = "", grupoItem = "";
        String cliente = "";
        double  tcPeso = 0, tcValor = 0, tcIpi = 0;
        double  ttPeso = 0, ttValor = 0, ttIpi = 0;

%>



WEBVENDAS - Manchester Tubos e Perfilados S/A















<%
while(resultCapa.next()) {
resultLinha = faturamento.linhaFaturados(resultCapa.getInt(6), empresa);
while(resultLinha.next()) {
if (resultLinha.getInt(1) > 0) {
lote = resultLinha.getString(16);
dimensao = dimensoes.buscaDimensao(resultLinha.getString(3), lote);
grupoItem = grupoitem.consultaGrupoItem(resultLinha.getString(3));
} else {
dimensao = resultLinha.getString(7);
grupoItem = resultLinha.getString(8);
}
if (!cliente.equals(resultCapa.getString(4)) && !cliente.equals("")) {
out.print("" + "" + "" + "" +
“” + “” +
“" +
“" +
“" +
“”);
tcPeso = 0;
tcValor = 0;
tcIpi = 0;
}
cliente = resultCapa.getString(4);
%>











<%
tcPeso = tcPeso + resultLinha.getDouble(4);
tcValor = tcValor + resultLinha.getDouble(5);
tcIpi = tcIpi + resultLinha.getDouble(6);
ttPeso = ttPeso + resultLinha.getDouble(4);
ttValor = ttValor + resultLinha.getDouble(5);
ttIpi = ttIpi + resultLinha.getDouble(6);
}
}
out.print(”" + “” +
“" +
“" +
“" + “” + “
” +
“” + "" +
“" +
“" +
“" +
“”);
%>
Cliente Romaneio Emissão Nota Produto Quantid. Faturada Peso(Kq)> Valor IPI
   Total por Cliente:”+formatador.format(tcPeso)+"”+formatador.format(tcValor)+"”+formatador.format(tcIpi)+"
<% out.print(resultCapa.getString(4)+" - “+resultCapa.getString(5)); %> <% out.print(resultLinha.getInt(1)+”/"+resultLinha.getInt(2)); %> <% out.print(formatData.format(resultCapa.getDate(1))); %> <% out.print(resultCapa.getInt(2)); %> <% out.print(grupoItem+" “+dimensao); %> <% out.print(formatador.format(resultLinha.getDouble(10))+” “+resultLinha.getString(9));%> <% out.print(formatador.format(resultLinha.getDouble(4))); %> <% out.print(formatador.format(resultLinha.getDouble(5))); %> <% out.print(formatador.format(resultLinha.getDouble(6))); %>
Total por Cliente:”+formatador.format(tcPeso)+"”+formatador.format(tcValor)+"”+formatador.format(tcIpi)+"
Total Geral: ”+formatador.format(ttPeso)+"”+formatador.format(ttValor)+"”+formatador.format(ttIpi)+"




<%
}
%>

12 Respostas

ivo_costa

Primeira coisa tira o usuário e senha do teu código pra nenhum espertinho tentar derrubar o teu servidor.
Ou já deleta esse usuário do teu servidor

pfusco

ivo costa:
Primeira coisa tira o usuário e senha do teu código pra nenhum espertinho tentar derrubar o teu servidor.
Ou já deleta esse usuário do teu servidor

Ja havia tirado, logo apos a postagem… mas os dados que estão ai são os de servido de teste… não tem como acessar com os dados que estavam na web não… Somente as classes são iguais.

Pedrosa

Use um pool de conexões para gerenciar sua aplicação.

ivo_costa

O teu problema é que toda vez que um método de busca é chamado tu abre uma nova conexão!!

Chama o método conecta apenas uma vez no teu contrutor. E tira os:

if (!conexao.Conecta()) return null;

dos métodos de busca. Não se esquece de em alguma parte do programa finalizar essa conexão quando o usuário fechar o aplicativo.

ze_kiefa

Provavelmente não é a conexão que está caindo, e sim o banco inteiro.
Você não está fechando a conexão com o banco.

Siga estes passos:

  1. Abra a conexão;
  2. Execute a consulta/transação;
  3. Feche a consulta/transação e;
  4. Feche a conexão com o banco.

É recomendável fechar a conexão sempre no finally, pois é garantido tanto na execução do código (try) quanto na excessão (catch).

Connection connectOracle;
Statement stmtOracle;
ResultSet resultado;

 try {
// conecta com o banco e obtém a conexão
connectOracle = DriverManager.getConnection(urlOracle, userOracle, paswOracle);
// transação
stmtOracle = connectOracle.createStatement();
// consulta
resultado = stmtOracle.executeQuery(comando); 
}
catch (Exception e) {
// trate a exceção a aqui;
} 
finally{
// fecha a consulta
resultado.close();
// fecha a transação
stmtOracle.close();
// fecha a conexão
connectOracle.close();
 
}
pfusco

ivo costa:
O teu problema é que toda vez que um método de busca é chamado tu abre uma nova conexão!!

Chama o método conecta apenas uma vez no teu contrutor. E tira os:

if (!conexao.Conecta()) return null;

dos métodos de busca. Não se esquece de em alguma parte do programa finalizar essa conexão quando o usuário fechar o aplicativo.

Eu uso pra fechar a conecção dentro de cada pagina a seguinte classe

public void Desconecta() {

try {

if(connectOracle != null){

connectOracle.close();

connectOracle = null;

}

if(stmtOracle != null){

stmtOracle.close();

stmtOracle = null;

}

if(resultado != null){

resultado.close();

resultado = null;

}

}catch (SQLException e) {}

}

que é chamada desta forma:

[/b]

Qto ao if (!conexao.Conecta()) return null; não entendi o pq de retira-lo dai, nos exemplos que encontrei e no “cursinho” que eu fiz sempre era implementado com esta expressão ai, para indicar qdo não conseguir abrir a conexão.

pfusco
ze_kiefa:
Provavelmente não é a conexão que está caindo, e sim o banco inteiro. Você não está fechando a conexão com o banco.

Siga estes passos:
1. Abra a conexão;
2. Execute a consulta/transação;
3. Feche a consulta/transação e;
4. Feche a conexão com o banco.

É recomendável fechar a conexão sempre no finally, pois é garantido tanto na execução do código (try) quanto na excessão (catch).

Connection connectOracle;
Statement stmtOracle;
ResultSet resultado;

 try {
// conecta com o banco e obtém a conexão
connectOracle = DriverManager.getConnection(urlOracle, userOracle, paswOracle);
// transação
stmtOracle = connectOracle.createStatement();
// consulta
resultado = stmtOracle.executeQuery(comando); 
}
catch (Exception e) {
// trate a exceção a aqui;
} 
finally{
// fecha a consulta
resultado.close();
// fecha a transação
stmtOracle.close();
// fecha a conexão
connectOracle.close();
 
}

Tentei encerrar a conexão desta forma depois do finally, mas infelizmente cortava a conexão e causava erro na pagina JSP da aplicação.

ivo_costa

pfusco:
ivo costa:
O teu problema é que toda vez que um método de busca é chamado tu abre uma nova conexão!!

Chama o método conecta apenas uma vez no teu contrutor. E tira os:

if (!conexao.Conecta()) return null;

dos métodos de busca. Não se esquece de em alguma parte do programa finalizar essa conexão quando o usuário fechar o aplicativo.

Eu uso pra fechar a conecção dentro de cada pagina a seguinte classe

public void Desconecta() {

try {

if(connectOracle != null){

connectOracle.close();

connectOracle = null;

}

if(stmtOracle != null){

stmtOracle.close();

stmtOracle = null;

}

if(resultado != null){

resultado.close();

resultado = null;

}

}catch (SQLException e) {}

}

que é chamada desta forma:

[/b]

Qto ao if (!conexao.Conecta()) return null; não entendi o pq de retira-lo dai, nos exemplos que encontrei e no “cursinho” que eu fiz sempre era implementado com esta expressão ai, para indicar qdo não conseguir abrir a conexão.

é que a cada chamada do conexao.Conecta() vc está abrindo uma nova conexão com o banco, ou seja uma hora o banco não aguenta e cai.

ps.: Se realmente o teu cursinho mandou fazer isso vai pra outro e pede o dinheiro de volta.

pfusco

ps.: Se realmente o teu cursinho mandou fazer isso vai pra outro e pede o dinheiro de volta.

Bem como eu disse sou novo em programação eu trabalhava com montagens html, javascript, flash,… mas isso não vêem ao caso, pintou a oportunidade de trabalhar com JAVA e estou procurando agarra-la…

Dentro da minha classe de conexão se coloco depois do finally os close esta causando ERRO, tentei encerrar tbem nas paginas JSP depois que terminava de mostrar o resultset eu dava o close nele no fim da pagina, outra tentativa sem sucesso.

Esta coisa de POOL de conexão parece bem interessante, preciso dar uma olhada neste material, alguem tem alguma referencia??? Estou re-estruturando as coisas aqui e vou reescrever toda esta parte de relatorios.

Se alguem tiver mais alguma dica ficarei grato demais.

ivo_costa

Faz o que eu disse, tira os if dos métodos de busca e só fecha a conexão quando encerrar a aplicação ,pra que quando o usuário for fazer uma nova busca ela esteja sempre lá.

A

Velho, colocar o metodo que fecha a conexao dentro do onunload do body não adianta em nada, isso é codigo que é rodado no servidor, ele vai rodar sempre que vc carregar a pagina, se prestar atenção no html gerado provavelmente o ounload deve ta vazio. Isso é código que roda no servidor, seus scriptlets não rodam do lado do cliente.

Alberto

pfusco

alots_ssa:
Velho, colocar o metodo que fecha a conexao dentro do onunload do body não adianta em nada, isso é codigo que é rodado no servidor, ele vai rodar sempre que vc carregar a pagina, se prestar atenção no html gerado provavelmente o ounload deve ta vazio. Isso é código que roda no servidor, seus scriptlets não rodam do lado do cliente.

Alberto

Não tinha me ligado nisso ai e vc tem a plena razão!!! Como to acostumado a fazer pagina td que eu quero que rode qdo fecha o browser eu uso o onunload. Mas vc esta cobertode razão nisso ai…
Vc tem algumasugestão a me dar?!?!?

Tipo Correr atras de aprender tbém este tal POOL de conexão ou correr atras de reescrever td o codigo de relatorios com algma maneira de fechar a conexão assim que termino de executar a Query?!?!?!?

Brigadão msm pela dica e aguardo um contato!! De repente vc tem algum caminho, apostila ou exemplo pra mim seguir um rumo…

[]'s

Criado 10 de abril de 2008
Ultima resposta 10 de abr. de 2008
Respostas 12
Participantes 5