Como abrir sessão no Hibernate

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();			
		
}

[/code]
Preciso que me ajudem… Obrigado a todos…

qual o problema ? poste o erro

abrassss

“Result consisted of more than one row”

Andei dando uma pesquisada… muitos programadores utilizam thread local para gerenciar essa sessão… É uma boa???

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

É uma das implementações mais usadas da classe HibernateUtil para trabalhar com sessão.

Segue um exemplo:


public class HibernateUtil {

	private static SessionFactory factory;
	private static Logger log = Logger.getLogger(HibernateUtil.class);

	private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();

	static {
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.configure();

		factory = cfg.buildSessionFactory();
	}

	public static Session openSession() {
		if (sessions.get() != null) {
			log.error("Ja existe uma sessao para esta thread!");
		}
		log.debug("Abrindo uma nova sessao");
		sessions.set(factory.openSession());
		return sessions.get();
	}

	public static void closeCurrentSession() {
		log.debug("Fechando sessao");
		sessions.get().close();
		sessions.set(null);
	}

	public static Session currentSession() {
		return sessions.get();
	}

	public static Statistics getStatistics() {
		return factory.getStatistics();
	}

}

abs

Valeu Lennon…

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=dahenz]Valeu Lennon…

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 :slight_smile:

[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.

abs

Blz… Valeu pela ajuda Lennon, vou fazer um teste com tabela temporária, lhe direi como o hibernate se comporta nisso. :wink:

Valew mesmo, quando precisar só escrever na medida do possível quem sabe eu possa ajudar :D…

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.

Vlw…

Estou com a mesma duvida do amigo acima, alguem saberia resolver?