Ajuda: Floggy muito lento

28 respostas
rafdutra

Boa tarde pessoal.

Estou utilizando o Floggy para a persistência de dados o qual recebe 2200 regsitros de um banco de dados e os salva no aparelho.
Estes registros são salvos em duas classes sendo a primeira de cabeçalho e a segunda de linha.

A primeira classe contém um array de objetos da segunda classe. Para salvar não tenho problema algum. O problema acontece ao recuperar alguma informação, pois ele demora de 20 a 40 minutos para trazer uma referência a esse objeto do cabeçalho.

O código é o seguinte:

boolean lazy = false;

ObjectSet os = Util.PM.find(OrdemProducao.class, new OrdemProducaoNumOpFilter(op), null, lazy);
        if (os != null && os.size() > 0) {
            return (OrdemProducao) os.get(0);
        }
        return null;

onde:

OrdemProducao é o objeto de cabeçalho;
OrdemProducaoNumOpFilter é o filtro que compara o atributo “op” que é único entre os objetos do tipo OrdemProducao;

Nesse caso, o tipo de consulta é não é LAZY pois esse objeto possui referencias aos objetos de linha.
O objetivo é minimizar o tempo da consulta.

Alguém tem uma solução?

28 Respostas

tmoreira2020

Olá Rafael,

Esse é um problema já conhecido em processo de solução. Estamos implementando a funcionalidade de índice no Floggy. Já existe uma versão funcional que está em fase de testes, caso lhe interesse por favor se inscreva na lista do Floggy (https://lists.sourceforge.net/lists/listinfo/floggy-user) para se manter atualizado.

Um abraço!

rafdutra

Boa tarde tmoreira.

Existe uma previsão para essa funcionalidade e porcentagem de melhoria?

Gosto muito do Floggy mas neste caso está ficando inviável pra mim.

Orbigado!
T+

rafdutra

Ahhhhh…esqueci!!

Sobre essa versão funcional…ela está disponível a usuários para testes ou ainda só para a equipe de desenvolvimento?

Obrigado!

tmoreira2020

Olá Rafael,

Ainda estamos testando somente internamente mas estamos procurando um caso real para ajudar a aparar as arestas… Vocês estariam dispostos a ser um beta test?

Um abraço!

Thiago Moreira

rafdutra

Olá Thiago!

Quando a fazer um teste, eu topo sim!
Caso você precise de um email pra contato pode ser pelo [email removido], caso contrário estou sempre por aqui!

Como seriam realizados os testes?

Abraço!

tmoreira2020

Boa tarde Rafael,

Você está na lista do Floggy?? Já estamos testando a nova funcionalidade de índice. Estais sabendo?

Um abraço

rafdutra

Bom dia Thiago.

Desculpe a demora pra responder e também dar o feedback dos testes com a nova feature do Floggy, opi sestou sem máquina em casa e tá meio complicado executar os testes.

Sim, estou na lista do Floggy, e até estava procurando seu email para tirar algumas dúvidas em relação aos testes pois não sei se compreendi mal ou se simplesmente não estou sabendo como habilitar o índice.

Você possui algum “tutorial” (howto) pra eu seguir? hehehe
Ou se eu puder lhe enviar o código para que você possa me ajudar.

Obrigado.
Abraço. T+

rafdutra

Thiago?

j0nny

tmoreira2020:

Olá Rafael,

Esse é um problema já conhecido em processo de solução. Estamos implementando a funcionalidade de índice no Floggy. Já existe uma versão funcional que está em fase de testes, caso lhe interesse por favor se inscreva na lista do Floggy (https://lists.sourceforge.net/lists/listinfo/floggy-user) para se manter atualizado.

Um abraço!


Como funcionaria estes índices no Floggy? :lol:

rafdutra

Bom, ainda estou com algumas dúvidas em relação a utilização dos índices. Porém esta funcionalidade ainda não está presente em nenhuma versão liberada para uso, ou seja, ainda está em fase de testes.

Não posso te dar mais detalhes porque ainda não consegui fazer funcionar, acho que deixei passar alguma coisa.

Abraço!

F

Oi Pessoal,

A versão que está em testes pode ser baixada http://floggy.sourceforge.net/1.4.0-alpha/floggy-persistence-1.4.0-SNAPSHOT.zip os plugins para Eclipse e Netbeans não implementam essa funcionalidade ainda então é necessário utilizar o Ant.

A task do Ant: (configurationFile)

O arquivo de configuração:

<?xml version="1.0" encoding="UTF-8"?> <floggy xmlns:tns="http://floggy.sourceforge.net/floggy-persistence-1.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://floggy.sourceforge.net/floggy-persistence-1.4.0 http://floggy.sourceforge.net/schema/floggy-persistence-1.4.0.xsd" generate-source="true"> <persistables> <persistable class-name="net.sourceforge.floggy.persistence.beans.animals.Bird"> <record-store-name>Bird</record-store-name> <indexes> <index name="byColor"> <field>color</field> </index> </indexes> </persistable> </persistables> </floggy>

Cadastrem-se na lista do floggy para maiores detalhes.

Abraço,

rafdutra

Não consigo prosseguir com os testes pois não tenho informação suficiente.
Se alguém também estiver realizando os testes com o índice do floggy então peço ajuda na seguinte questão:

Eu salvo meus objetos porém na hora da consulta não me retorna nada. Seguem os códigos:

Floggy_index.xml

<?xml version="1.0" encoding="UTF-8"?>
<floggy xmlns:tns="http://floggy.sourceforge.net/floggy-persistence-1.4.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://floggy.sourceforge.net/floggy-persistence-1.4.0 http://floggy.sourceforge.net/schema/floggy-persistence-1.4.0.xsd"
        generate-source="true">
    <persistables>
        <persistable class-name="br.com.cooxupe.armazem.pojo.Carregador">
            <record-store-name>Carregador</record-store-name>
            <persistable-strategy>single</persistable-strategy>
            <indexes>
                <index name="byId">
                    <field>id</field>
                </index>
            </indexes>
        </persistable>
    </persistables>
</floggy>

Configuração do build.xml no netbeans 6.8

<!-- floggy -->
    <property name="floggy.path" value="C:\Documents and Settings\rafael\Meus documentos\Rafael\Libs\Floggy 1.4\lib"/>

    <path id="floggy.classpath">
        <fileset dir="${floggy.path}" includes="*.jar"/>
    </path>

    <target name="post-compile">
        <taskdef
            name="floggy-persistence-weaver"
            classname="net.sourceforge.floggy.persistence.WeaverTask"
            classpathref="floggy.classpath"/>
        <floggy-persistence-weaver
            bootclasspath="${platform.bootclasspath}"
            classpath="${libs.classpath}"
            input="${build.classes.dir}"
            output="${build.classes.dir}"
            configurationfile="${src.dir}/floggy_index.xml" />
    </target>

Classe Carregador:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.cooxupe.armazem.pojo;

import net.sourceforge.floggy.persistence.Persistable;
import org.json.me.JSONException;
import org.json.me.JSONObject;

/**
 *
 * @author rafael
 */
public class Carregador implements Persistable {

    private String id;
    private String nome;
    private boolean lista;

    public Carregador() {
        this.id = new String();
        this.nome = new String();
        this.lista = false;
    }

    public Carregador(String id, String nome) {
        this.id = id;
        this.nome = nome;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public boolean isLista() {
        return lista;
    }

    public void setLista(boolean lista) {
        this.lista = lista;
    }

    public String toString() {
        return (id + " " + nome);
    }
}

Método de teste de chamada:

public static void teste() throws FloggyException {
        Carregador c = new Carregador();
        IndexFilter f = new IndexFilter("byId", new String("227"));
        ObjectSet os = Util.PM.find(Carregador.class, f, true);
        int size = os.size();

        System.out.println("Here 1");
        for (int i = 0; i < size; i++) {
            os.get(i, c);
            System.out.println(">" + i + "\t" + c.getNome());
        }
        System.out.println("Here 2");
    }

Saída do método de teste:

Here 1
0>
Here 2

Obs: Eu salvo normalmente utilizando o método SAVE do PERSISTABLE MANAGER.

Obs2: Utilizando o método FIND com os FILTROS normais também não encontro nenhum registro quando realizo toda a configuração dos índices. Quando não é feita nenhuma configuração em relação aos índices, o método FIND com o filtro normal retorna os dados normalmente.

Obrigado.

F

Depois de salvar os objetos faça shutdown no PersistenceManager.

rafdutra

To fazendo o teste aqui.

Nesse caso eu preciso implementar os métodos equals e hashCode?

F

Não precisa. O Floggy, nessa implementação de indice atual, usa o hashCode do campo. No seu caso o hashCode do id.

rafdutra

Adicionei o PersistableManager.shutdown() no meu código mas mesmo assim não me retornou nada.

rafdutra

Percebi uma coisa bem estranha também. Quando coloco esse código:

Carregador c = new Carregador();
        IndexFilter f = new IndexFilter("byId", new String("227"));
        ObjectSet os = Util.PM.find(Carregador.class, f, true);
        int size = os.size();

        System.out.println("Here 1");
        for (int i = 0; i < size; i++) {
            os.get(i, c);
            System.out.println("> " + i + "   " + c.getNome());
        }
        System.out.println("Here 2: " + size);

A saída é a seguinte:

Here 1

0
Here 2: 1

Ou seja, encontrou apenas um registro, que é o certo, porém não retornou nada no atributo nome.

E quando eu uso este código:

Carregador c = new Carregador();
        IndexFilter f = new IndexFilter("byId", new String("227"));
        ObjectSet os = Util.PM.find(Carregador.class, f, true);
        int size = os.size();

        System.out.println("Here 1");
        for (int i = 0; i < size; i++) {
            os.get(i, c);
            System.out.println("> " + i + "   " + c.getNome());
            System.out.println("> " + i + "   " + c.getId());
            System.out.println(">   " + c);
        }
        System.out.println("Here 2: " + size);

A seguinte saída é mostrada:

Here 1
Here 2: 0

Muito estranho.

rafdutra

Ninguém que está testando a nova funcionalidade sabe qual tipo de problema ocorre com o código acima?

tmoreira2020

Bom dia Rafael,

Não vejo diferença nos códigos, exceto os println.

um abraço

rafdutra

Mas qual a explicação para o código acima não funcionar??

tmoreira2020

Boa tarde Rafael,

Como você salvou o seu objeto Carregador? Você tem certeza que está salvando ele corretamente? Por acaso o erro acontece depois de reiniciar a aplicação!?

Todos os testcases referentes a esta funcionalidade estão passando (green), não há, aparentemente, motivo pelo qual os dados não estejam sendo carregados.

Um abraço

rafdutra

Bom…para salvar eu simplesmente carrego os dados com informações vindas de um xml por WebService, assim:

Carregador carr;

//Entra no loop do tratamento do XML
carr = new Carregador();
carr.setId(key);
carr.setNome(inner.getString("nom"));
carr.setLista(false);
manager.save(carr); //manager é uma instancia de PersistableManager

//Fim do loop

manager.shutdown();

Não me retorna nenhum erro em momento algum (ao salvar, ao consultar, ao compilar o código). Simplesmente ele não me retorna uma instancia de Carregador.
O índice cadastrado no XML é do tipo String, tem algum problema?

E o que pode estar acontecendo?

Obrigado.
Abraço!

tmoreira2020

Bom dia Rafael,

Você consegue achar o objeto Carregador sem utilizar a funcionalidade de Index, somente utilizando o find antigo do Floggy? O problema acontece somente quando você reinicia a aplicação ou logo após salvar o objeto Carregador?

Um abraço

rafdutra

Boa tarde Thiago.

Quando eu gravo os dados de Carregador utilizando o índice (configurando o xml), eu não consigo recuperar nenhuma instância mesmo utilizando o find normal (sem index).

O problema (não conseguir recuperar uma instância) acontece desde o primeiro momento que eu realizo uma consulta, mesmo sem reiniciar a aplicação.

Notei também uma coisa estranha.

Carregador c = new Carregador();
IndexFilter f = new IndexFilter("byId", new String("227"));
ObjectSet os = Util.PM.find(Carregador.class, f, true);
int size = os.size();

System.out.println("Here 1");
for (int i = 0; i < size; i++) {
   os.get(i, c);
   System.out.println("> " + i + "   " + c.getNome());
   System.out.println("> " + i + "   " + c.getId());
   System.out.println(">   " + c);
}
System.out.println("Here 2: " + size);

A primeira vez que executo esse código, a saída é a seguinte:

Here 1

Here 2: 1

Consultando logo em seguida, a saída é o seguinte:

Here 1
Here 2: 0

Estranho.

rafdutra

Alguém ai tem algum projetinho (pequeno que seja) que testou a funcionalidade de índice do floggy pra passar pra mim pois não estou conseguindo fazer funcionar.

Olhando um código pronto posso comparar com o meu e assim ver onde eu posso estar errando.

Obrigado!

rafdutra

Bom dia a todos.

Estudando mais a fundo a nova feature, consegui fazer rodar o aplicativo utilizando índice com sucesso.
Porém ainda existe um problema. Eu consigo apenas consultar uma informação quando eu salvo os dados no banco, ou seja, quando eu fecho o aplicativo e rodo novamente, nada é encontrado pelo método FIND.

Alguém ai já passou por isso? Sabe como resolver?

Obrigado!

J

Olá rafdutra,

Estou acompanhando esse post a dias, pois tenho uma situação parecida. Tem como você postar o seu código no qual utilizou o índice?

Com relação ao problema de não salvar os dados, já tive algo parecido, mas estava relacionado com o emulador no qual eu estava usando. Não tinha relação com o Floggy. Caiu a luz e isso começou a acontecer.
Tive que apagar um arquivo dentro da pasta do emulador, não lembro exatamente qual, tive que “resetar” ele.

Experimente - se já não fez isso - rodar sua aplicação no celular diretamente, e ver se o comportamento permanece.

rafdutra

Então cara, testei o mesmo código no emulador e no aparelho e ambos acontecem a mesma coisa. Sempre que eu consulto uma informação logo após salvar os objetos, sempre é retornado a informação correta.
Basta eu fechar o aplicativo e iniciar novamente que qualquer item que eu consulte não me retorne nada.

Agora os códigos que estou usando são os seguintes:

Salvar objetos:

public static String importarCarregadores() {
        String retorno = new String();
        PersistableManager manager = PersistableManager.getInstance();

        try {
            Sincronizacao sinc = SincronizacaoBD.consultarSincronizacao(manager, "carregador");
            String carregadores = CarregadorWS.importarCarregadores((sinc == null) ? "" : sinc.getDataSincronizacao());

            if (carregadores != null) {
                JSONObject outer = new JSONObject(carregadores);
                JSONObject inner;
                String key;
                Carregador carr;
                ObjectSet os;

                Enumeration e = outer.keys();
                if (sinc == null) {
                    while (e.hasMoreElements()) {
                        key = (String) e.nextElement();
                        inner = outer.getJSONObject(key);

                        carr = new Carregador();
                        carr.setId(key);
                        carr.setNome(inner.getString("nom"));
                        carr.setLista(false);
                        manager.save(carr);
                    }
                    sinc = new Sincronizacao();
                    sinc.setTabela("carregador");
                } else {
                    while (e.hasMoreElements()) {
                        key = (String) e.nextElement();
                        inner = outer.getJSONObject(key);

                        os = manager.find(Carregador.class, new CarregadorIdFilter(key), null);
                        if (os.size() > 0) {
                            carr = (Carregador) os.get(0);
                        } else {
                            carr = new Carregador();
                            carr.setId(key);
                        }
                        carr.setNome(inner.getString("nom"));
                        carr.setLista(false);
                        manager.save(carr);
                    }
                }
                sinc.setDataSincronizacao(Util.getDataServidor());
                manager.save(sinc);

                carregadores = null;
                outer = null;
                inner = null;
                key = null;
                carr = null;
                os = null;
                e = null;
                sinc = null;
                System.gc();

                retorno = "Carregadores OK!\n";
            } else {
                retorno = "Nenhum Carregador!\n";
            }
        } catch (Exception ex) {
            retorno = "ERRO: Carregadores!\n";
        } finally {
            try {
                manager.shutdown();
            } catch (Exception ex) {
            }
        }

        return retorno;
    }

Em resumo esse código se conecta ao meu servidor, executa uma consulta, formata os dados no padrão JSON, que logo após é lido, cria os objetos e os persistem. (Obs: cerca de 1200 objetos são pesistidos).

Consulta:

public static Carregador teste(String id) throws FloggyException {      
        Carregador c = new Carregador();
        IndexFilter f = new IndexFilter("byId", new String(id));
        ObjectSet os = Util.PM.find(Carregador.class, f, false);
        if (os != null && os.size() > 0) {
            os.get(0, c);
        }
        return c;
}

Floggy XML: (Mesma pasta do Build)

<?xml version="1.0" encoding="UTF-8"?>
<floggy xmlns:tns="http://floggy.sourceforge.net/floggy-persistence-1.4.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://floggy.sourceforge.net/floggy-persistence-1.4.0 http://floggy.sourceforge.net/schema/floggy-persistence-1.4.0.xsd"
        generate-source="true">
    <persistables>
        <persistable class-name="teste.Carregador">
            <record-store-name>Carregador</record-store-name>
            <!--<persistable-strategy>single</persistable-strategy>-->
            <indexes>
                <index name="byId">
                    <field>id</field>
                </index>
            </indexes>
        </persistable>
    </persistables>
</floggy>

Adiciono no Build:

<property name="floggy.path" value="C:\Documents and Settings\rafael\Meus documentos\Rafael\Libs\Floggy 1.4\lib"/>

    <path id="floggy.classpath">
        <fileset dir="${floggy.path}" includes="*.jar"/>
    </path>

    <target name="post-compile">
        <taskdef
            name="floggy-persistence-weaver"
            classname="net.sourceforge.floggy.persistence.WeaverTask"
            classpathref="floggy.classpath"/>
        <floggy-persistence-weaver
            bootclasspath="${platform.bootclasspath}"
            classpath="${libs.classpath}"
            input="${build.classes.dir}"
            output="${build.classes.dir}"
            configurationfile="floggy.xml"/>

Ao fechar a aplicação tenho:

try {
            PersistableManager.getInstance().shutdown();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

No geral é isso.

Ainda continuo com esse problema, não o que pode estar dando erro.

Criado 1 de fevereiro de 2010
Ultima resposta 13 de abr. de 2010
Respostas 28
Participantes 5