Necessidade de fechar a sessão no SQLite

698 views
Skip to first unread message

Eder

unread,
Feb 16, 2012, 8:42:20 AM2/16/12
to Android Brasil - Dev
Ola pessoal,

Na minha aplicação quase todas as activities estão usando o banco. Eu
estou abrindo uma sessão no sqlite e usando ela em todas as
activities. Gostaria da opinião de vocês, eu deveria abri e fechar a
cada requisição ou deixo uma só referencia aberta como esta
atualmente?

A aplicação esta funcionando perfeitamente, só quero prever problemas
futuros.

Marcelo Henrique

unread,
Feb 16, 2012, 8:44:37 AM2/16/12
to androidb...@googlegroups.com
interessante seria fechar todas as sessoes depois de utilizado .. 

abre sessao
  .. faz o que tem que fazer no banco 
fecha sessao
--
                                              - Marcelo Henrique -
  "Se não puder se destacar pelo talento, vença pelo esforço." (Dave Weinbaum)

Clebão - EcoCentauro

unread,
Feb 16, 2012, 11:04:43 AM2/16/12
to androidb...@googlegroups.com
Posso estar falando  besteira agora mas...

Provavelmente você esta trabalhando com cursores correto?

Existe o startManagingCursor que vai gerencia o ciclo de vida do CursorLoader. segue o link



Lembrando que essa metodo do Activity esta deprecated segundo a documentação oficial do android. Mas você pode resolver atraves 

Eder

unread,
Feb 16, 2012, 1:39:10 PM2/16/12
to Android Brasil - Dev
Estou trabalhando também com cursores, mas não somente cursores.

Eu abro o banco, e com a mesma instancia do banco que fica na
Application eu faço deletes, inserts, etc...

On 16 fev, 14:04, Clebão - EcoCentauro <cleba...@gmail.com> wrote:
> Posso estar falando  besteira agora mas...
>
> Provavelmente você esta trabalhando com cursores correto?
>
> Existe o startManagingCursor que vai gerencia o ciclo de vida do
> CursorLoader. segue o link
>
> http://developer.android.com/reference/android/app/Activity.html#star...)
>
> Lembrando que essa metodo do Activity esta deprecated segundo a
> documentação oficial do android. Mas você pode resolver atraves
>
> Em 16 de fevereiro de 2012 11:44, Marcelo Henrique
> <marceloh...@gmail.com>escreveu:
>
>
>
>
>
>
>
> > interessante seria fechar todas as sessoes depois de utilizado ..
>
> > abre sessao
> >   .. faz o que tem que fazer no banco
> > fecha sessao
>

André Luiz R. Silva

unread,
Feb 16, 2012, 1:45:41 PM2/16/12
to androidb...@googlegroups.com
O ideal é seguir o conselho do nosso amigo Marcelo.

A conexão do banco tem timeout. Tem que tomar muito cuidado com isso.

2012/2/16 Eder <ede...@gmail.com>



--
Atenciosamente,

André Luiz R. Silva
@andreronsilva


Alex Baule

unread,
Feb 16, 2012, 1:55:51 PM2/16/12
to androidb...@googlegroups.com
Sqlite nao tem timeout, nao é conexao de rede... é abertura de arquivo.

vc pode setar na mao timeout para operações, devido a lock na tabela q
vc pode fazer... (q nao é o caso dele)

O problema de deixar a sessão aberta é se por acaso seu app encerrar,
vc pode perder dados ou corromper o arquivo do banco e perde-lo.


Em 16 de fevereiro de 2012 16:45, André Luiz R. Silva
<macoli...@gmail.com> escreveu:

Victor Gouveia

unread,
Feb 16, 2012, 1:57:31 PM2/16/12
to androidb...@googlegroups.com
Em todos os teus metodos do repositorio tu usa db = RepositoryScript.getSQLiteDatabase(context); no try e no finally tu usa o db.close
--
Agradeço, Victor Gouveia.

André Luiz R. Silva

unread,
Feb 16, 2012, 2:11:42 PM2/16/12
to androidb...@googlegroups.com
Exatamente pra evitar o lock que se coloca o timeout. 

Se colocando o timeout, você evita exatamente o problema de corromper arquivo de banco ou perder dados. =)

E com o timeout força você a encerrar as conexões a cada execução. Não é legal deixar sem timeout o Sqllite.

Alex Baule

unread,
Feb 16, 2012, 2:39:17 PM2/16/12
to androidb...@googlegroups.com

Nada a ver o q vc falou.

Timeout no sqlite é unica e exclusivamente para operacoes sql, e vc setar ou nao, nao causa perda de dados por corromper arquivos, o timeout é para "banco, se em x tempo vc nao conseguir fazer y operacao, me retorne erro e nao fique tentando infinitamente".  E no caso o lock que eu disse é vc dar um lock na tabela para inserir algo e ninguem usar aquela tabela enquanto vc esta com o lock, acabou sua operacao, vc da o commit e acabou o lock.
A conexao se encerra com close, nao com o retorno do timeout do try do lock qune vc deu na tabela.

Mais uma vez, sqlite nao usa socket, é abertura de arquivos, nao tem timeout.

Em 16/02/2012 17:12, "André Luiz R. Silva" <macoli...@gmail.com> escreveu:

André Luiz R. Silva

unread,
Feb 16, 2012, 3:50:39 PM2/16/12
to androidb...@googlegroups.com
Ok, posso ter me equivocado. Mas acho que você ta viajando também Alex.

Primeiro, por más que o Sqlite trabalhe com arquivos, ele é um SGBD. Ele transcreve as "Tabelas" em arquivos e acessa diretamente ele em formas de SQL. Pelo que conheço do SQLite não existe outra forma de acesso sem ser via SQL.

http://www.sqlite.org/tclsqlite.html#timeout

Se você trabalha com consultas em SQL, sempre seu banco tem que ter implementando um timeout. Ok, por padrão o SQLite não coloca timeout. Mas se você estiver construindo uma aplicação mobile com várias AssyncTasks que buscam valor e insere em tabelas. E que por ventura algumas dessas tabelas são acessadas por mais de uma AT, pode acontecer de ter algum problema de "lockar" uma tabela. O timeout evita que a tabela fique lockada infinitamente. 


2012/2/16 Alex Baule <alexw...@gmail.com>

Alex Baule

unread,
Feb 16, 2012, 7:27:25 PM2/16/12
to androidb...@googlegroups.com
André, vc tá confundindo timeout de conexão com timeout de transaction.

O timeout de transaction é praticamente impossivel de acontecer, sei
pq já criei daemons em C/C++ e Perl, com bancos de sqlite com mais de
5 GBs de dados, com milhares de inserts , selects, deletes e updates
ao mesmo tempo. O unico problema que existia era em caso inserts e
updates, que caso acontececem ao mesmo tempo e o disco demorasse a
gravar, o sqlite criava arquivos de journal (q hoje é configuravel)
para fazer a inserção/update qdo o banco tivesse folga.

Aqui (http://www.sqlite.org/lockingv3.html) eles explicam como fizeram
os Locks de arquivo (que influenciam no timeout).

A implementação de timeout do sqlite é completamente diferente de um
SGDB, o timeout dele é unica e exclusivamente para o lock dado no
arquivo (flock igual fosse num arquivo comum) para a gravação em disco
de um insert/update, ou qdo vc chama o lock EXCLUSIVE via PRAGMA.
(http://www.sqlite.org/pragma.html) .

O funcionamento do Sqlite é MUUUITO diferente de um SQL Server,
Postgres ou MySQL, mesmo sendo um SGDB. Por ele ser mais simples, é
muito mais rápido q qquer outro SGBD. As unicas coisas em comum do
SQLite com os outros citados é a linguagem entre banco e client, ser
SQL e o ACID.

E SQL é uma linguagem de banco, só isso.

Eu trabalho com sqlite desde 2002 (versão 2.4.X), sei direitinho todos
os problemas que o sqlite pode dar.

Por isso eu digo, setar timeout no SQLite nao vai fazer nada em
relação a proteção de dados.

Existem até alguns tunnings para se fazer no sqlite, através de
pragmas que melhoram bastante o desempenho do banco, mas num app
mobile, dificilmente vai dar diferença.


Em 16 de fevereiro de 2012 18:50, André Luiz R. Silva

André Luiz R. Silva

unread,
Feb 16, 2012, 9:26:46 PM2/16/12
to androidb...@googlegroups.com
Opa Blz Alex.

=D

Entendido os pontos de divergência.

Valeu pela explicação.

2012/2/16 Alex Baule <alexw...@gmail.com>

Alex Baule

unread,
Feb 17, 2012, 5:44:19 AM2/17/12
to androidb...@googlegroups.com
De nada...

Em 17 de fevereiro de 2012 00:26, André Luiz R. Silva

Bruno Baudel

unread,
Feb 17, 2012, 6:12:22 AM2/17/12
to androidb...@googlegroups.com
Gostei dessa conversa aprendi mt sobre sqlite, são tópicos assim q valem ser lidos ate o fim.


Abraço pessoal.


Bruno Baudel
Reply all
Reply to author
Forward
0 new messages