Métodos static

12 respostas
carine

Olá a todos!!!

Estou montando um sistema para web em java usando JSP e surgio uma dúvida conceitual…

Eu posso usar um método que adiciona usuários no banco como sendo static???

Está funcionando certinho, mais fiquei em dúvida sobre o que pode ocorrer caso dois usuários tentem se cadastrar ao mesmo tempo :frowning:

Obrigada a todos!

12 Respostas

xgucax

Olá Carine.
Como está o processo de gerência das PKs no seu sistema?
[]'s

carine

A chave primária é o id (gerado automaticamente no Mysql).

xgucax

Bem, creio eu que como não há manipulação da chave gerada (exemplo, vc define uma chave na sua classe e manda salvar na base de dados e posteriormente utiliza essa chave como atributo de sessão) creio que o processo de concorrência não terá problemas pois seu método save parece ser atômico. Existe manipulação de parâmetro do contexto, ou algo que seja global e manipulado por todas as requisições? Caso não haja, creio que não há probblemas.

Mas para garantir você poderia colocar o método e os passos para salvar o objeto em um bloco synchronized.

Espero ter ajudado
Boa sorte

carine

Entendi o conceito. Mais não sei como posso colocar tudo em um bloco sincronizado…

Você tem algum exemplo?

Obrigada pela ajuda :slight_smile:

Mantu

Dê uma olhada nisso, talvez ajude
http://java.sun.com/docs/books/tutorial/essential/concurrency/locksync.html

carine

Bem… pelo que eu li, isso pode diminuir a performance :frowning:

De acordo com a experiência de vocês, é interessante utilizar este tipo de artifício???

Fiquei preocupada, pois performance é um requisito importante deste projeto… mais ao mesmo tempo, também me preocupa ter dois usuários chamando o método de cadastro simultaneamente e os objetos confundindo-se entre si.

Esses riscos são reais??? Na verdade, não sei nem se minhas dúvidas fazem sentido…

Obrigada pela ajuda!

xgucax

Assim, pelo que eu entendi, o seu método estático receberá os parâmetros e salvará o “objeto” correto? Ao meu ver, como é apenas isso que ele faz, não há condições de “objetos se confundirem” pois eles não compartilham de dados.
Se por exemplo, você tivesse no seu método save uma rotina que, recuperasse um INTEIRO que está atribuído no contexto, povoasse seu objeto e atribuíse o Id do seu objeto com esse conbtexto, e só no final você incrementasse esse inteiro, aí teria problema pois um outro thread de um outro servlet poderia recuperar esse valor antes de seu primeiro thread icrementá-lo.
Como creio que não há isso, essa cquestão de concorrência é apenas um detalhe.

A respeito da performance, acredite… em um sistema web de médio porte você nem notará a diferença, pois a execução do método é muito rápida no servidor.
Caso você tenha uma base de dados muito grande e complexa, sugiro remodelar o sistema com algum Padrão de projeto DAO, etc…

Boa sorte

carine

Creio ser este o meu caso, pois o banco terá cerca de 200.000 registros…

Com relação ao que você disse com relação a manipular um inteiro antes de gravar os dados no banco, acho que eu posso estar fazendo isso:

public static void adicionarUsuario1(String email) {

try{

ResultSet rs = null;

Connection connection = ConexaoMysql.getConnection();
PreparedStatement stm1 = connection.prepareStatement 
                                ("select email from mergulhou where email = ?");
          stm1.setString (1, email);
          rs = stm1.executeQuery();                
        int i = 0;
        while (rs.next()) {
            i++;
        }
        if (i == 0){
            ResultSet rs2 = null;
            PreparedStatement stm = connection.prepareStatement 
                                    ("INSERT INTO usuario (chave, id_premio, minutos_iniciais, data_cadastro) VALUES (?, 0, 0, CURDATE())");
             stm.setString (1, email);	
             stm.executeUpdate();
             stm.close();
                                    
        } else {
             system.out.println("Não é possível gravar seus dados já estão registrados");
         }                
        rs.close();
        stm1.close();
        connection.close();
   } catch (Exception e){
       System.out.println(e);
   }
}

Obrigada!

xgucax

Pelo que eu vi sua chave primária em usuário é o email.
Correto?
Não creio que haverá problema de concorrência pois será muito difícil 2 pessoas terem o mesmo e-mail e acessarem a funcionalidade de cadastro ao mesmo tempo
:smiley:

carine

Value pela ajuda!!!

De qualquer forma vou guardar a informação da sincronização…

Valeu mesmo :slight_smile:

davidbuzatto

Você está utilizando transações? No MySQL 5.0 já existe a possibilidade de utilizar esse recurso. Com ele vc não precisa sincronizar a aplicação, o banco faz o trabalho para você. Caso alguém já esteja cadastrando algo (a operação do banco está sendo executada) ninguém pode cadastrar ou alterar aquela linha.

Dá uma pesquisada.

Até mais!

carine

Obrigada pela dica…

Mais neste caso os cadastros teriam realmente que ser simultaneos.

Criado 8 de janeiro de 2007
Ultima resposta 9 de jan. de 2007
Respostas 12
Participantes 4