tengan
Abril 20, 2006, 11:54am
#1
na minha aplicação uma das páginas trava em um certo ponto.
ponto é
String[] respostasbd = (String[]) session.getAttribute("respostas");
String[] perguntas = (String[]) session.getAttribute("perguntas");
após essas duas linhas a página para e a máquina fica lenta.
o processo java.exe toma conta da CPU ew mesmo fechando tudo ele continua rodando.
qual o problema?
tengan
Abril 20, 2006, 11:59am
#2
aqui está o fonte completo:
os JOptionPane foram usados para saber onde está o erro.
<%@page import = "java.sql.Connection"%>
<%@page import = "java.sql.DriverManager"%>
<%@page import = "java.sql.PreparedStatement"%>
<%@page import = "java.sql.ResultSet"%>
<%@page import = "java.sql.SQLException"%>
<%
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost/info_pai","infocad","dacofni123");
//para teste
javax.swing.JOptionPane.showMessageDialog(null,"carregou o driver");
// ele para de executar aqui
String[] respostasbd = (String[]) session.getAttribute("respostas");
String[] perguntas = (String[]) session.getAttribute("perguntas");
//para teste
for(int a = 0; a < 10; a++){
javax.swing.JOptionPane.showMessageDialog(null,String.valueOf(a));
}
// Obtém as respostas digitadas pelo aluno na página anterior
String[] respostasusu = new String[10];
javax.swing.JOptionPane.showMessageDialog(null,"primeiro for");
for (int i = 0;i<respostasusu.length;i++){
javax.swing.JOptionPane.showMessageDialog(null,String.valueOf(i));
String resp = "Resp" + String.valueOf(i+1);
respostasusu[i] = request.getParameter(resp);
}
// Correção da prova
int acertos = 0;
int erros = 0;
javax.swing.JOptionPane.showMessageDialog(null,"segundo for");
for (int j = 0; j<respostasusu.length;j++){
javax.swing.JOptionPane.showMessageDialog(null,String.valueOf(j));
String usu = respostasusu[j];
String bd = respostasbd[j];
if (usu.equalsIgnoreCase(bd))
acertos++;
else
erros++;
}
int total = acertos + erros;
float aproveitamento = (acertos / total) * 100;
//String codigoprova = (String) session.getAttribute("cd_prova");
PreparedStatement prova = conexao.prepareStatement("INSERT INTO tb_prova (rm,nr_acertos,nr_erros,pc_aproveitamento,cd_data_prova)" +
" VALUES (?,?,?,?,?);");
prova.setString(1,(String)session.getAttribute("usuario"));
prova.setInt(2,acertos);
prova.setInt(3,erros);
prova.setFloat(4,aproveitamento);
prova.setString(5,(String)session.getAttribute("cd_data_prova"));
int result = prova.executeUpdate();
prova = conexao.prepareStatement("SELECT * FROM tb_prova;");
ResultSet resulprova = prova.executeQuery();
resulprova.last();
javax.swing.JOptionPane.showMessageDialog(null,"terceiro for");
for (int k = 0; k < respostasusu.length; k++){
javax.swing.JOptionPane.showMessageDialog(null,String.valueOf(k));
PreparedStatement resposta = conexao.prepareStatement("INSERT INTO tb_respostas (id_prova,cd_questao,resposta,rm)" +
" VALUES (?,?,?,?);");
resposta.setInt(1,resulprova.getInt("id_prova"));
resposta.setInt(2,Integer.parseInt(perguntas[k]));
resposta.setString(3,respostasusu[k]);
resposta.setString(4,(String) session.getAttribute("usuario"));
result += resposta.executeUpdate();
}
if (result == 11){
response.sendRedirect("./mensagem_prova.jsp");
} else {
response.sendRedirect("./prova.jsp?ERRO=Problema no Banco de Dados, não foi possível concluir a sua prova");
}
} catch(Exception e){
response.sendRedirect("realizar_prova.jsp?erro=ERRO: " + e.toString());
}
%>
qualquer ajuda eu agradeço
Se for possível, use HashMap para salvar dados na sessão, não vetor, que é bem mais complexo. Isso alivia os streamings de transmissão de dados, processamento, uso de memória… Transmitir vetor pela sessão causa sobrecarga no sistema.
Mas cadê o commit ou rollback das suas operações com o banco de dados??
Sem um nem outro o banco vai ficar esperando até que isso aconteça, ou um commit ou um rollback.
Após todo o processo lá no final faça o seguinte:
conexao.commit();
catch(Exception e) {
conexao.rollback()
}
finally {
conexao.close();
}
E não se esqueça de fechar SEMPRE os resultset e os PreparedStatement senão vai ficar coisa pendurada lá no banco e você não conseguirá mais conexões.