Forma certa de construir o DAO

Galera eu tenho um projeto e utilizo o hibernate para consultas no banco, porem mesmo assim meu banco fica caindo por estar fazendo muitas conexoes simultaneas.
abaixo esta o codigo da minha classe DAO generica

import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public abstract class DAOGenerics<K, G> {

    public void inserir(K obj) {


        SessionFactory sf = new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory();
        Session s = sf.openSession();

        s.getTransaction().begin();

        s.saveOrUpdate(obj);
        s.getTransaction().commit();
        s.close();
    }

    public void apagar(K obj, Session s) {

        s.getTransaction().begin();
        s.delete(obj);
        s.getTransaction().commit();

    }

    public void apagar(K obj) {

        SessionFactory sf = new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory();
        Session s = sf.openSession();

        try {
            apagar(obj, s);
        } finally {
            s.close();
        }
    }

    public abstract K buscar(G obj);

    public abstract K buscar(G obj, Session s);

    public abstract List<K> buscarTodos();

    public abstract List<K> buscarTodos(Session s);
}

eu pensei em talvez criar os objetos SessionFactory e Session de forma estatica, mas nao sei se essa eh a solucao. Alguem pode me dar uma dica, dizer se essa classe esta certa ou se tem algum erro.

VLW

Olha o meu DAO usando o Spring + Hibernate

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class GenericDao<T> extends HibernateDaoSupport  {

	public GenericDao() {}	

	public void salvar(T obj) {
		getHibernateTemplate().saveOrUpdate(obj);	
		getHibernateTemplate().flush();
	}

	public void remover(Object obj) {
		getHibernateTemplate().delete(obj);
		getHibernateTemplate().flush();
	}

	@SuppressWarnings("unchecked")
	public T buscar(Class<T> clazz, Long id) {
		return (T) getHibernateTemplate().get(clazz, id);
	}

	@SuppressWarnings("unchecked")
	public List<T> listar(Class<T> clazz) {
		return (List<T>)getHibernateTemplate().find("from " + clazz.getName());
	}
}

cara,

eu utilizo SessionFactory:

[code]public class HibernateUtil {

private static SessionFactory factory;

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

	factory = cfg.buildSessionFactory();
}

public static Session getSessao() {
	return factory.openSession();
}

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

}[/code]

meu DAO fica mais ou menos assim:

public class ContribuinteDAO {

	private Session session;

	public ContribuinteDAO() {
		this.session = HibernateUtil.getSessao();
	}

p/ evitar as quedas…vc pode criar 1 pool de conexões, não manjo muito bem(ainda estou estudando isso) mas da uma olhada sobre “c3p0”.

att,

É uma aplicação desktop? Se sim, a melhor forma é criar o SessionFactory dentro de um bloco static. Se for uma aplicação web, crie dentro de um ServletContextListener. Quanto à Session, se for uma aplicação desktop stand-alone (que roda só na JVM local), você pode criá-la estaticamente também e mantê-la aberta enquanto a aplicação estiver no ar. Só lembre de fechá-la quando encerrar a aplicação. Se for uma aplicação web, o interessante é criar um ServletFilter e abrir e fechar a Session em cada método do DAO.
Só tome cuidado com a LazyInitializationException. Aqui tem algumas dicas quanto a isso: http://blog.caelum.com.br/enfrentando-a-lazyinitializationexception-no-hibernate/

Aproveitando segue link de uma das maneira que utilizo de como usar dao generico com hibernate + projeto de filtro criado por min.
Dem uma olhada neste link abaixo, para mim e alguns colegas foi muito util pode ser para vcs tb…
http://www.guj.com.br/java/221618-filter-dinamico-para-hibernate

Abrçs