Ajuda: Floggy muito lento

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

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

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!

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

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.

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!

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!

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.

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.