Pessoal, estou com um pequeno problema…
Tenho um sistema web utilizando como ferramenta de persistência o framework hibernate…
Acontece que, quando um usuário faz o acesso remoto, a conexão funciona perfeitamente para esse usuário, fazendo suas devidas persistências e tudo mais, e quando um segundo usuário acessa simultâneamente, esse segundo usuário tem problemas com a persistência…
Estou utilizando banco de dados MySQL, e vejo que existe apenas 1 conexão ativa no banco, mesmo com dois acessos simultâneos…
Esse é o código da minha classe de factory:
[code]public class MySQLDAOFactory extends MySQLDAO{
private static SessionFactory factory;
static {
AnnotationConfiguration cfg = new AnnotationConfiguration();
//classes adicionadas ao objeto cfg!!!
factory = cfg.buildSessionFactory();
}
public static Session getSession() throws ClassNotFoundException, SQLException{
return factory.openSession();
}
Mas isso ocorre quando? depois que é feito um “SELECT”, certo? Pode ser que no SELECT você espera 1 resultado (talvez usando o uniqueResult) e ele está retornando mais que 1 resultado. Dê uma verificada nisso
Só mais uma dúvida… Você atribui o retorno do método openSession() para as sessões do DAO???
E para fechar você utiliza o método closeCurrentSession???
Obrigado mesmo…
[/quote]
hm… Não, dentro do meu DAO eu utilizo uma Session, que eh atribuida pelo o construtor do DAO, ai tanto faz vc qual metodo vc vai chamar se eh o openSession() ou currentSession().
Sim ai para fechar a sessao apos utlizar o DAO eu chamo o closeCurrentSession().
Lennon, eu utilizei o seu código e funcionou perfeitamente, o desempenho ficou muito bom… Obrigado…
Mas tenho uma dúvida, observei que quando minha máquina acessa o sistema no banco fica criada uma sessão, para o servidor com uma porta, um socket, quando outra máquina acessa simultaneamente, ele utiliza a mesma sessão, alterando apenas a porta, ou seja, não ficam duas sessões abertas no banco MySQL.
Pergunta: Quando um usuário está trabalhando com tabelas temporárias no banco, e outro usuário acessa, e cria as mesmas tabelas temporárias, isso não dará algum problema, pois pro banco os dois acessos estão na mesma sessão…
O hibernate trata isso???
Bom Lennon, só tenho a agradecer, você me ajudou muito ontem obrigado
[quote=dahenz]Lennon, eu utilizei o seu código e funcionou perfeitamente, o desempenho ficou muito bom… Obrigado…
Mas tenho uma dúvida, observei que quando minha máquina acessa o sistema no banco fica criada uma sessão, para o servidor com uma porta, um socket, quando outra máquina acessa simultaneamente, ele utiliza a mesma sessão, alterando apenas a porta, ou seja, não ficam duas sessões abertas no banco MySQL.
Pergunta: Quando um usuário está trabalhando com tabelas temporárias no banco, e outro usuário acessa, e cria as mesmas tabelas temporárias, isso não dará algum problema, pois pro banco os dois acessos estão na mesma sessão…
O hibernate trata isso???
Bom Lennon, só tenho a agradecer, você me ajudou muito ontem obrigado :)[/quote]
Então na verdade, a ideia dessa clase utilizar Thread é para que cada usuário tenha sua Session criada em uma Thread diferente, e depois de utilizada ela deve ser fechada e setada como null, para que ninguem convenha de pegar um Thread que ja foi usada e ainda esteja comuma Session aberta.
Agora sobre sua pergunta de criação de tabelas temporarias eu não sei te responder, sei que o Hibernate, trata de concorrencia para 2 usuarios tentarem fazer alterações em de dados em uma tabela ja criada.
Eu estou com uma classe HibernateUtil igual a de Lennon,
porém estou tendo dificuldade no controlador e no Dao de como
e onde usar as session(open, getcurrent e o close).
Eu faço de um jeito da NPE se eu faço de outro diz a thread já existe.
Se alguem tiver como disponobolizar um exemplo de como abrir a sessão só uma vez
e depois pegar só a sessão corrente usando o controller e o Dao para persistir os dados,
eu iria agradecer pois estou apanhando nisto.