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();
				}

11 Respostas

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

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

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! :slight_smile:

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.

java.lang.NullPointerException

at com.mysql.jdbc.ResultSetImpl.setRowPositionValidity(ResultSetImpl.java:830)

at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7046)

at db.MembroDao.obterMembrosConsulta(MembroDao.java:367)

at frame.FramePrincipalCruzamentos.pesquisar(FramePrincipalCruzamentos.java:315)

at frame.FramePrincipalCruzamentos.access$0(FramePrincipalCruzamentos.java:185)

at frame.FramePrincipalCruzamentos$1.actionPerformed(FramePrincipalCruzamentos.java:450)

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)
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.

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.
public List obterMembrosConsulta(int idadeMinima, int idadeMaxima) throws Exception{

			Conexao conexao = new Conexao();
			List lista = new Vector();
			
			int anoAtual = Calendar.getInstance().get(Calendar.YEAR);
			int anoMin = anoAtual - idadeMaxima;
			int anoMax = anoAtual - idadeMinima;
			
			if (idadeMinima <= idadeMaxima)
			{
				String sql = "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;";
				int sexo;
				int nascimento;
				int anoMemAtual;


				ResultSet rs = conexao.executeQuery(sql);
				try {
					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"));
						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 (Exception e) {
					e.printStackTrace();
				}
				return lista;
			}
			else 
			{
				lista = null;
				JOptionPane.showMessageDialog(null, "Idade Minima é Maior que Idade Maxima!");
				return lista;
			}	
			
		
		}
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.
:smiley:

victorwss

formigaotts:
aumentei os valores XMx e XMs da JVM e deu certo!
valeu pessoal.
:smiley:

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.

Criado 6 de agosto de 2008
Ultima resposta 12 de ago. de 2008
Respostas 11
Participantes 5