Memória Estourada

4 respostas
Ronni

Galera, é o seguinte.

Tenho um SQL e o mesmo retorna mais de 900.000 registros, preciso deste número total de registros, mas sem fazer um count(*) no sql.
Uma das soluções que achei aqui no forum foi:

//vai para o último registro
		rs.last();	
		//pega a linha
		ultimoRegistro = rs.getRow();
		//volta para o ínicio do resultset, ou seja o primeiro registro
		rs.beforeFirst();

Ok, funciona perfeitamente quando são poucos registros, mas no meu caso dá o erro abaixo.

Exception in thread main java.lang.OutOfMemoryError: Java heap space

at oracle.jdbc.dbaccess.DBDataSetImpl.getBytesItem(DBDataSetImpl.java:1439)

at oracle.jdbc.driver.OracleStatement.getBytesInternal(OracleStatement.java:3309)

at oracle.jdbc.driver.OracleStatement.getBytesValue(OracleStatement.java:4564)

at oracle.jdbc.driver.OracleResultSetImpl.getBytes(OracleResultSetImpl.java:606)

at oracle.jdbc.driver.ScrollableResultSet.cacheAllRows(ScrollableResultSet.java:2127)

at oracle.jdbc.driver.ScrollableResultSet.getLastRow(ScrollableResultSet.java:2207)

at oracle.jdbc.driver.ScrollableResultSet.last(ScrollableResultSet.java:510)

at br.infoseg.action.Main.main(Main.java:218)

Alguém tem alguma idéia como resolver isso, Jedis do java.

Grande abraço.

4 Respostas

P

Por favor, posta seu código pra facilitar

rubinelli

Se você setar o seu ResultSet para algo diferente de ResultSet.TYPE_FORWARD_ONLY, ele vai tentar cachear os resultados, e com quase um milhão de registros, não há memória que resista. Você realmente precisa saber quantos registros foram retornados?

Ronni

Segue o código como solicitado

Obrigado.

public class Main {

private static final String SQL_GRANDE = "SELECT * FROM TABELA WHERE CONDICAO = XPTO"


public Main() {                                                                                                                                                                                                                                                                                                                                                         
	// TODO Auto-generated constructor stub                                                                                                                                                                                                                                                                                                                               
}

public static void main(String[] args) {

try {                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                                    
		oracle.jdbc.OracleConnection conn = (OracleConnection) DAO.getConnectionDetran();
		
		//cria um statement navegável
		OraclePreparedStatement pstmt = (OraclePreparedStatement) conn                                                                                                                                                                                                                                                                                                                                     .prepareStatement(SQL_GRANDE, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
		OracleResultSet rs = (OracleResultSet) pstmt.executeQuery();
int   = 0;

int y = 0;

int ultimoRegistro = 0;

int diferenca = 0;

PrintWriter out = null;			

String total=090000;

int count=0;

System.out.println(Inicializando…”);
//vai para o último registro
		rs.last();	
		//pega a linha
		ultimoRegistro = rs.getRow();
		//volta para o ínicio do resultset, ou seja o primeiro registro
		rs.beforeFirst();
} catch (Exception e) {

System.out.println(e.getMessage());

}

}
Ronni

Oi rubinelli, preciso saber sim, mas já to pensando em arrumar outra solução, mesmo assim muito obrigado.

Pensei que o Java tivesse alguma classe que já fizesse isso de forma rápida como em outras linguagens.

Grande abraço.

Criado 8 de abril de 2009
Ultima resposta 9 de abr. de 2009
Respostas 4
Participantes 3