Hibernate Session / EntityManager在压力测试时关闭

时间:2017-02-27 08:46:52

标签: java spring hibernate

我有一个带有hibernate的Spring Web应用程序。我差不多完成了开发工作,并且正在运行一些压力测试,以了解如果很多用户同时在同一页面上连接会发生什么。

我必须在我的Hibernate配置或/和代码上做错了,因为我收到了这些错误:

formatedMessage : Session is closed!
Message : Session is closed!
Erreur : java.lang.IllegalStateException: EntityManager is closed
stacktrace : java.lang.IllegalStateException: EntityManager is closed
    [...]

formatedMessage : EntityManager is closed
Message : EntityManager is closed
SQL Error: 0, SQLState: 55000
Ce statement a été fermé.
Erreur : org.hibernate.exception.GenericJDBCException: could not extract ResultSet
stacktrace : org.hibernate.exception.GenericJDBCException: could not extract ResultSet
    [...]
Caused by: org.postgresql.util.PSQLException: Ce statement a été fermé.

以下是代码:

public class Application
{
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "application_seq_gen")
    @SequenceGenerator(name = "application_seq_gen", sequenceName = "application_id_seq",initialValue = 1, allocationSize = 1)
    private int id;

    private String nom;
    private Boolean autorise; //Autorise la validation automatique de l'application
    private String domaineFonctionnel;

    @ElementCollection(fetch=FetchType.EAGER)
    @CollectionTable(name="applicationMail")
    @Column(name="mail")
    private Set<String> listMail;

    [...]
}

public ArrayList<Application> getListApplication() {

    entityManager = entityManagerFactory.createEntityManager();
    Session session = entityManager.unwrap(Session.class);

    Criteria criteria = session.createCriteria(Application.class);
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

    ArrayList<Application> listApplication = new ArrayList<Application>();
    listApplication.addAll(criteria.list());

    entityManager.close();

    return listApplication;
}

有人知道这里的问题是什么吗?

1 个答案:

答案 0 :(得分:1)

由于连接限制,您的数据库可能连接不足?

如果连接用完,您应该在数据库上允许更多或检查是否关闭所有已完成的连接。 (我看到你控制你的实体经理和会话所以这可能是一个例子)

另外你为什么要使用EntityManagerFactory?你有充分的理由吗?如果没有,请尝试@PersistanceContext它应该解决您的问题。

您只能在Spring管理的类中使用@PersistanceContext。 (仅限弹簧组件)。否则,您需要继续通过EntityManagerFactory获取实体经理