Duvida sobre funcionamento de conexão

7 respostas
Zeed01

Boa noite colegas !

Meu problema é o seguinte:

Tenho um Singleton que cria uma conexão com um BD e quero utilizar essa conexão em toda as telas da aplicação.
Até aí tudo bem.

O problema é que, estando com o aplicativo aberto e usando essa conexão, as outras alterações realizadas no banco, por outro usuario, não estão aparecendo pra mim.

Exemplo:

Tenho uma tela com os registros:
1 - Banana
2 - Pera
3 - Maça

Se outro usuário inclui mais um item, por exemplo 4 - Uva, não aparece pra mim, mesmo fechando a tela e abrindo de novo, só aparece se eu fecho o aplicativo e abro de novo… ou seja, se crio a conexão de novo.

Como teste, alterei a classe Singleton e deixei como uma classe normal, ou seja, criando uma nova conexão cada vez que entro na tela, daí funciona.

Alguem sabe porque ?

Abraços.

7 Respostas

Metaleiro

[color=darkblue] Depois que você faz um update ou insert, você tem que dar um commit na conexão:[/color]

con.setAutoCommit(false);
PreparedStatement insert = con.prepareStatement(
    "INSERT INTO TABELA(JVM, CLASSES ) VALUES (5, "TESTE")");
insert.executeUpdate();
con.commit();
con.setAutoCommit(true);
insert.close();
Zeed01

Oi amigo…

Infelizmente já estou fazendo isso:

stp = cf.conn.prepareStatement("Insert into perfil values(? , ?)");
            
stp.setString(1,null);
stp.setString(2, perfil.getPepeDescricao());

stp.executeUpdate();
cf.conn.commit();

Alguem tem alguma outra idéia ?

Um abraço.

Metaleiro

[color=darkblue] Tente dar um close no stp[/color]

stp.close()

[color=darkblue] Depois quando for carregar os dados novamente, use um select e dê um repaint na tela ou um this.revalidate()[/color]

m0ska

Não respondendo sua questão mas acreditando estar te ajudando muito, muito mesmo:

Não use classes sigleton para realizar conexão com bancos de dados, imagina que vc está com vários usuários trabalhando em um sistema e os dois estão fazendo transações diferentes… mas um termina primeiro descobre uma falha e dá um rollback, e agora?

Outra coisa, não chama o banco de dados diretamente da tela de aplicação e sim das classes de negócio, seja por intermédio de DAO ou não.

Acredito que com estas medidas cada vez menos problemas rodearam você :smiley:

sergiotaborda

Primeiro vc deve desistir de ter uma só conexão. Se o preocupa ter muitas conexões, use um conection pool (é só procurar que ha muito material sobre isso no guj)

Segundo, vc deve ,sempre, em qq codigo que manipule o banco abrir uma conexão no incio do processo e fechá-la no fim. Sempre!
Isso evita que objetos que vc usa , como statements e resultset fiquem em cache e portanto não mostrando os dados reais do banco.

Terceiro, se o programa é multiusuário ( e mesmo que não seja) use transações. Vc pode implementar controle transacional de várias formas.
As mais comuns são os metodos commit/roolbak/setautocommit de Connection e o uso de JTA ( que controla mais do que um recurso transacional)

Portanto, o que está acontecendo consigo é normal. É assim mesmo que funciona. Só que não é assim que vc realmente quer que funcione :lol:

Zeed01

Bom dia colegas !

m0ska:

Talvez eu esteja realmente perdidão sobre como conexões funcionam… mas veja vem, o sistema que estou trabalhando é desktop, sendo assim, mesmo estando usando um singleton, eu acabo tendo uma conexão para cada usuário… ou não ?
Sendo assim quando um usuário der um rollback não irá afetar o outro que esta em outra máquina…

Sobre chamar o banco diretamente da tela de aplicação, acho que você esta se referindo a classe que faz a interface com o usuário… mas eu concordo com você e realmente não faço isso… a minha classe de interface trabalha com um objeto que recebe da classe de controle, que por sua vez utiliza uma uma outra classe DAO para recuperar ou gravar informações no banco.

sergiotaborda:
Tem alguma dica sobre conection pool ? Juro que procurei mas não encontrei algo que respondesse diretamente como construir um.

Então se entendi, o fato de permanecer com a conexão aberta esta causando o problema de receber dados desatualizados ? Mesmo estando recriando meu List através de um novo Select no Banco ?

Obrigado a todos.

Abraços.

Metaleiro

http://www.jdbc-tutorial.com/

http://www.javapassion.com/j2ee/JDBC.pdf

Criado 6 de julho de 2007
Ultima resposta 11 de jul. de 2007
Respostas 7
Participantes 4