Duvidas sobre performance do HSQLDB usando mais de 1.000.000 de registros

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

A galera, vale lembrar que estou usando JDBC puro.

Obrigado

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

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.

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.

[code]

    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();
    
    
    [/code]

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.

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.

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:

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