Duvidas sobre performance do HSQLDB usando mais de 1.000.000 de registros

8 respostas
TeiTei

Galera, estou usando HSQLDB para salvar uma carga de registros grande, o problema e que para testar performance criei uma unica tabela dentro do meu banco HSQLDB e comecei a popular com muitos registros, o que notei foi o seguinte:

Na primeira remessa ele inseri tranquilamente 1.000.000 de registros, mas na segunda na hora de inserir mais 1.000.000 ele fica extremamente lento e acaba explodindo a memória heap.

O estranho é que primeiro abro a conexão, persisto 1.000.000 com batch fecho e encerro a aplicação, ai inicio a aplicação novamente, no momento em que ele vai criar uma conexão com o banco tudo ja fica mais lento, só para abrir a conexão ja demora mais de 30 segundos.

As duvidas são:

O java carrega esse banco em memoria como se estivesse lendo um arquivo?

O HSQLDB não suporta muitos resgistros tipo, acima de 1.000.000?

Obrigado

8 Respostas

TeiTei

A galera, vale lembrar que estou usando JDBC puro.

Obrigado

E

Você precisar usar tabelas em arquivos (o default é em memória).

TeiTei

O problema e que vou precisar salvar os dados nesse banco, gravar em um dvd para que um client java leia esses dados…o arquivo fisico deve existir.

TeiTei

Abaixo segue o codigo que persiste as 100000 de linhas....na segunda vez que rodo isso, só para conseguir a conexão demora mais de 60 segundos.

Connection c = DriverManager.getConnection("jdbc:hsqldb:file:C://meu banco//meubanco", "sa", "");
	    PreparedStatement p= null;
	  
             p = c.prepareStatement("INSERT INTO TESTE (NOME) VALUES(?)");
	  
	    
	    for(int i=0; i<1000000; i++){
	    	p.setString(1, "Teste de valores-->"+i);
	    	p.addBatch();
	    	
	    }
	
	    p.executeBatch();
	    
            p  = c.prepareStatement("SELECT * FROM TESTE");
	 
	        
	    ResultSet r = p.executeQuery();
	    
	 
	    
	    while(r!=null && r.next()){
	    	System.out.println(r.getString(1));	    	
	    }
	
	    c.commit();
E

Então… se você não configurar corretamente a base do HSQLDB, ele só usa o arquivo em duas ocasiões: quando lê o arquivo em memória, e quando você sai da sua aplicação e os dados são gravados da memória para o disco.

http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

Você deverá ter de setar corretamente hsqldb.cache_rows ou cache_size, provavelmente.

TeiTei

Mesmo configurando o Cache e nio ao incluir mais de 1.500.000 de registros em uma tabela a memoria heap explode, parece que ele carrega o arquivo inteiro em memoria.

E

Se não me engano, são os índices que ficam em memória (tosco porém verdade em algumas versões antigas do HSQLDB).

Você já investiu muito tempo nele? Talvez você pudesse considerar o Derby ou JavaDB :frowning:

TeiTei

Fiz o mesmo teste com derby, ele parece ser bem mais lento…para persistir o primeiro milhão ele demorou muito mais que o hsqldb…mas vou tentar ir com mais força em cima do derby

Criado 22 de maio de 2013
Ultima resposta 22 de mai. de 2013
Respostas 8
Participantes 2