Sincronização mobile com servidor

18 views
Skip to first unread message

Diogo Vieira

unread,
May 7, 2014, 9:33:36 AM5/7/14
to flex-...@googlegroups.com
Olá pessoal, estou tendo alguns problemas com sincronização em mobile.

Vou explicar o cenário e gostaria de saber a melhor forma para realizar a sincronização.

Desenvolvi uma aplicação em Flex para mobile com banco SQLite, em que o usuário trabalha offline, ou seja, ele faz uma primeira sincronização para baixar a base para o dispositivo, daí ele vai a campo realizar o trabalho, faz as modificações e cadastros tudo offline e na volta para a empresa, realiza novamente uma sincronização para retornar os dados para o servidor.

Problemas encontrados:
Em uma primeira tentativa, verifiquei que ao tentar sincronizar uma base com mais ou menos 5000 mil registros para o dispositivo, a aplicação para de responder.

Sendo assim, pensem em enviar por partes... Defini 50 registros por vez. Isto resolveu o problema de "aplicação não respondendo", mas o tempo da sincronização aumentou muito e verifiquei que o processo do IIS aumentou muito, pois está indo-e-vindo várias vezes ao servidor.

Gostaria de saber se alguém já enfrentou um problema assim... alguém tem alguma sugestão?


Obrigado.
Diogo Vieira

Jairo França

unread,
May 13, 2014, 7:18:19 AM5/13/14
to flex-...@googlegroups.com
Tenho feito trabalhos deste tipo. A primeira dica é a seguinte: crie um campo no seu BD remoto do tipo TIMESTAMP e coloque este campo como atualizando automaticamente toda vez que o registro for alterado. Assim você sabe quando o registro foi alterado. Quando sincronizar, busque esta data e grave no seu BD local. Quando for sincronizar novamente, busque a última data de atualização do seu banco local e na pesquisa ao BD remoto coloque na cláusula where a restrição de buscar só os registros após esta data...
Se quiser me adiciona no skype que passo detalhes. Usuário jairofranca


--
--
-----------------------------------------------------------------------------
Você está recebendo essa mensagem por que faz parte do grupo de discussão
flex-mobile, para sair do grupo basta enviar mensagem para flex-mobile...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo quot;flexmobile" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para flex-mobile...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

ALLAN MARMO

unread,
May 13, 2014, 7:33:17 AM5/13/14
to flex-...@googlegroups.com
Eu estou trabalhando com com 2 Banco, um recebe a carga inicial, depois de ter carga ele fica checando no outro Banco se existe uma nova data, caso existe uma nova data, pego as novas informações e insiro novamente ou atualizo, estou fazendo como o Jairo França passou, só que utilizo 2 Banco.
--

---------------------------------------------------------------
Allan Marmo
Analista de Sistemas - SEO
Brasil Componentes Automotivos LTDA EPP
Goiânia - Go

Jairo França

unread,
May 14, 2014, 9:02:42 AM5/14/14
to flex-...@googlegroups.com
Outra coisa: eu pensava que minha aplicação estava lenta para sincronizar por conta de transmissão de dados; era parcialmente verdade. As inserções/atualizações no banco de dados local estavam demorando. Incluindo uma série de "inserts/updates" dentro de um bloco begin/commit para atualizar os dados locais melhorou muito....

ALLAN MARMO

unread,
May 14, 2014, 10:08:51 AM5/14/14
to flex-...@googlegroups.com
Um exemplo do meu uso:

$sql_06 = "UPDATE tabela SET campos WHERE (condição)";
        // Atualiza a data geral de todas as cidades
$sql_06_02 = "UPDATE tabela SET campos WHERE (condição)";

           try {

           DB::beginTransaction();

           $sql_06 = DB::prepare($sql_06);
           $sql_06->bindValue("i_cdcidade", $row->i_cdcidade);
           $sql_06->bindValue("i_cdvendedor", $row->i_cdvendedor);
           $sql_06->bindValue("i_cdarea", $row->i_cdarea);
           $sql_06->bindValue("f_excluido_area", $row->f_excluido_area);
           $sql_06->bindValue("d_atualizacao_area", $row->d_atualizacao_area);
           $sql_06->bindValue("d_inclusao_area", $row->d_inclusao_area);
           $sql_06->execute();

           $sql_06 = DB::prepare($sql_06_02);
           $sql_06->bindValue("i_cdvendedor", $row->i_cdvendedor);
           $sql_06->bindValue("i_cdarea", $row->i_cdarea);
           $sql_06->execute();

           DB::commit();
       } catch (Exception $exc) {
           DB::rollBack();
           throw new Exception($exc->getMessage());
       }

Diogo Vieira

unread,
May 15, 2014, 9:42:56 AM5/15/14
to flex-...@googlegroups.com
Olá Jairo 

Fiz algumas mudanças no meu projeto e melhorou muito...
A mais significativou foi fazer os inserts dento de um begin/commit. Além disso, troquei webservice por JSON.
Agora vou estudar essa solução do atributo TIMESTAMP para ficar perfeito...

Obrigado pelas dicas.
Valeu pelas respostas também Allan...

Reginaldo Ap. Rigo

unread,
May 27, 2014, 10:35:46 AM5/27/14
to flex-...@googlegroups.com
Olá Diogo,

Utilizo o conceito do campo TIMESTAMP mas não uso esse campo.

Na minha base tem um campo STATUS que inicialmente recebe o conteúdo X  ( indefinido )
e ao ser alterado recebe um outro valor em função da alteração que ocorreu em campo.

Tenho também outro campo que marca se o registro já foi exportado que inicialmente
recebe o valor de N ( não exportado )

Ao exportar de volta para a base o sistema verifica e exporta apenas os itens não exportados com conteúdo
diferente de X e exportado igual a N

Ao exportar, claro, o sistema marca o registros já exportados,

Reginaldo

Jairo França

unread,
Jun 4, 2014, 3:25:46 PM6/4/14
to flex-...@googlegroups.com

Pode ser assim com o flag, mas se varios dispositivos tiverem que ser sincronizados, o timestamp resolve para todos de uma vez, ja que cada um guarda sua data da ultima atualizacao. Na hora de sincronizar cada dispositivo informa a data da ultima atualizacao e a pesquisa no servidor limita os registros.

Reply all
Reply to author
Forward
0 new messages