Java.sql.SQLException: Operation not allowed after ResultSet closed
11 respostas
formigaotts
estou com um problema de SQLException, ele carrega aproximadamente 90 mil registros depois gera excessão e pára na linha 9,
se tiver idéia do que seja ficarei agradecido.
Excessão:
java.sql.SQLException: Operation not allowed after ResultSet closed
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:768)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:812)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5528)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5448)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5488)
at db.MembroDao.obterMembrosConsulta(MembroDao.java:369)
at Frame.FramePrincipalCruzamentos.pesquisar(FramePrincipalCruzamentos.java:322)
at Frame.FramePrincipalCruzamentos.access$0(FramePrincipalCruzamentos.java:192)
at Frame.FramePrincipalCruzamentos$1.actionPerformed(FramePrincipalCruzamentos.java:457)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Código:
ResultSet rs = conexao.executeQuery(sql);
try {
int sexo;
while(rs.next()){
Membro m = new Membro();
Familia f = new Familia();
f.setNumFamilia(rs.getInt("fam_codigo"));
m.setFamilia(f);
m.setMemNome(rs.getString("mem_nome"));
sexo = (rs.getInt("mem_sexo"));
if (sexo == 1){
m.setMemSexo("M");
} else {
m.setMemSexo("F");
}
m.setMembroRenda(rs.getDouble("mem_vlrenda"));
f.setTotRendaFamilia(rs.getDouble("fam_totrenda"));
lista.add(m);
}
} catch (SQLException e) {
e.printStackTrace();
}
Erro estranho… porque ele fala que o resultset esta fechado…
Então cara… meio por cima assim eu não intendi muito, mas deixa eu perguntar…
Ele roda esse laço 90mil vezes? e ai depois para?
Você viu que a excessão esta dando no getString()?
Att
Ricoldi
formigaotts
sim, ele roda o while 90 mil vezes ai quando lança a excessão ele me retorna os 80 mil registros normalmente…
sim, eu vi onde está a excessão, porém não dá para saber o porque.
ricoldi:
Fala formigaotts,
Erro estranho… porque ele fala que o resultset esta fechado…
Então cara… meio por cima assim eu não intendi muito, mas deixa eu perguntar…
Ele roda esse laço 90mil vezes? e ai depois para?
Você viu que a excessão esta dando no getString()?
Att
Ricoldi
ricoldi
Não sei se tem algo a ver mais um amigo aqui do trampo disse para você tentar dar um rs.first() no resultset antes de começar o while.
ps? perguntinha da galera… 90mil registros? car**o o que tem nessa tabela?
Att
Ricoldi.
A
Artur_Drummond
bom … pela quantidade de registros, será que é necessário trazer TODOS os 90 mil em uma única query ?
Tenta fazer o seguinte: Muda a sua query e fala pra retornar a partir da posição que deu o problema -1 . No caso, se foi na posição 80 mil, começa a partir da 79999 até o 90000.
Ve se fazendo isso ele para de dar erro e consegue processar.
Vlw
formigaotts
então, preciso fazer em somente uma query, para facilitar as consultas, e também em duas querys não seria meio gambits?
bom, eu contei a quantidade de registros dentro do ResultSet está certo, 162 mil, porém não consigo adquirir todos.
outra curiosidade é que as vezes muda a exception, dá NullPointerException, depois volta essa excessão que postei anteriormente, e também muda sempre o valor da iteração do erro, varia de 90 mil à 105 mil…
vou verificar se existe algum limite de registros no ResultSet.
bom qualquer coisa estamos aí.
valeu!
Artur Drummond:
bom … pela quantidade de registros, será que é necessário trazer TODOS os 90 mil em uma única query ?
Tenta fazer o seguinte: Muda a sua query e fala pra retornar a partir da posição que deu o problema -1 . No caso, se foi na posição 80 mil, começa a partir da 79999 até o 90000.
Ve se fazendo isso ele para de dar erro e consegue processar.
Vlw
formigaotts
continua o problema, entre os varios tipos de excessão vai mais uma pra se alguem já tiver passado por esse problema da um help ae.
Cole o código do método, todo e não apensa essa bloco que vc mostrou no inicio do tópico, acredito que seu erro seja em virtude outra coisa.
formigaotts
italo.vendrameto:
Cole o código do método, todo e não apensa essa bloco que vc mostrou no inicio do tópico, acredito que seu erro seja em virtude outra coisa.
publicListobterMembrosConsulta(intidadeMinima,intidadeMaxima)throwsException{Conexaoconexao=newConexao();Listlista=newVector();intanoAtual=Calendar.getInstance().get(Calendar.YEAR);intanoMin=anoAtual-idadeMaxima;intanoMax=anoAtual-idadeMinima;if(idadeMinima<=idadeMaxima){Stringsql="select distinct mem.mem_codigo, mem.mem_nome, fam.fam_codigo, extract(year from mem_dtnasc) as dtnasc, mem_sexo, mem_vlrenda, fam_totrenda from familia fam inner join membro mem on (fam.fam_codigo = mem.fam_codigo)";sql+=" order by mem_dtnasc desc;";intsexo;intnascimento;intanoMemAtual;ResultSetrs=conexao.executeQuery(sql);try{while(rs.next()){Membrom=newMembro();Familiaf=newFamilia();f.setNumFamilia(rs.getInt("fam_codigo"));m.setFamilia(f);m.setMemNome(rs.getString("mem_nome"));nascimento=rs.getInt("dtnasc");anoMemAtual=anoAtual-nascimento;m.setDtNascimento(anoMemAtual);sexo=(rs.getInt("mem_sexo"));if(sexo==1){m.setMemSexo("M");}else{m.setMemSexo("F");}m.setMembroRenda(rs.getFloat("mem_vlrenda"));f.setTotRendaFamilia(rs.getFloat("fam_totrenda"));lista.add(m);}}catch(Exceptione){e.printStackTrace();}returnlista;}else{lista=null;JOptionPane.showMessageDialog(null,"Idade Minima é Maior que Idade Maxima!");returnlista;}}
victorwss
Isso parece algum tipo de problema causado por um OutOfMemoryError dentro do MySQL.
Ah, por sinal, lembre-se de fechar seus ResultSets em um finally.
formigaotts
aumentei os valores XMx e XMs da JVM e deu certo!
valeu pessoal.
victorwss
formigaotts:
aumentei os valores XMx e XMs da JVM e deu certo!
valeu pessoal.
Isso não resolve o problema, apenas o adia. Ao invés de ocorrer com 80 mil registros vai começar a ocorrer com 800 mil, 8 milhões, sei lá.
O problema é o fato de você colocar todos estes elementos em uma lista monstruosamente gigantesca devorando a sua memória. O certo seria mudar a abordagem e puxar um de cada vez, trabalhar com ele e descartá-lo, puxando o próximo em seguida, ou então trabalhar com algum tipo de paginação.