JPA - Exceção quando tem vários acessos simultâneos

Olá,

Tenho um site que, quando testo no localhost nunca deu erro, mas quando está no ar, com algumas pessoas acessando ao mesmo tempo, de vez em quando dá umas exceções (intermitente). Às vezes basta recarregar a página que volta, às vezes tem que reiniciar o Tomcat.

As exceções mais comuns são:

[code]javax.servlet.ServletException: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute query

root cause

org.postgresql.util.PSQLException: This statement has been closed.[/code]

e

Criei uma classe para conseguir reproduzir o erro, simulando mais de um usuários acessando a base ao mesmo tempo:

public class TesteAcessosSimultaneos {
    
    public void realizarTeste(int numAcessosSimultaneos) {
        for (int i = 0; i < numAcessosSimultaneos; i ++) {
            new Buscador(i).start();
        }
    }

}

class Buscador extends Thread {
    
    private JogoService jogoService = new JogoService();
    
    private int i;
    
    public Buscador(int i){
        this.i = i;
    }
    
    public void run() {
        try {
            jogoService.findByBusca("teste");
            System.out.println("==============================");
            System.out.println("Teste " + i + " executado com sucesso");
        } catch(Exception e) {
            System.out.println("==============================");
            System.out.println("Teste " + i + " NÃO foi executado com sucesso");
            e.printStackTrace();
        }
    }
}

Minha classe service, resumindo, está assim:

public class JogoService extends BasicService {

    public List<Jogo> findByBusca(String busca) {
        Query query = entityManager.createQuery("SELECT j FROM Jogo j " +
                " WHERE (lower(j.nome) like :busca ) ");
        query.setParameter("busca", "%"+busca+"%");
        return query.getResultList();
    }

}

Essa classe extende de BasicService, que está assim:

public class BasicService {

    protected static EntityManagerFactory entityManagerFactory;
    protected static EntityManager entityManager;
    protected static EntityTransaction transaction;
    
    static {
        entityManagerFactory = Persistence.createEntityManagerFactory("persistenceUnit");
        entityManager = entityManagerFactory.createEntityManager();
        transaction = entityManager.getTransaction();
    }
}

Quando eu chamo o método TesteAcessosSimultaneos.realizarTeste() passando como parâmetro qualquer número maior ou igual a 2 (acessos simultâneos), sempre dá erro.

Alguém pode me ajudar?

olá. conseguiu resolver este problema do thread “Transaction not active” ?

Estou tendo um problema assim

[quote] Exception in thread “Thread-5” java.lang.IllegalStateException: Transaction not active
at org.hibernate.ejb.TransactionImpl.getRollbackOnly(TransactionImpl.java:110)
at org.springframework.orm.jpa.JpaTransactionManager$JpaTransactionObject.isRollbackOnly(JpaTransactionManager.java:598)
at org.springframework.transaction.support.DefaultTransactionStatus.isGlobalRollbackOnly(DefaultTransactionStatus.java:154)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:720)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy122.processarRemetida(Unknown Source)[/quote]