无法阻止Hibernate打开太多连接

时间:2013-02-22 21:29:36

标签: hibernate hibernate-mapping

我正在使用:Hibernate 3.6.8 with mySQL,Tomcat 6,JDBC connection pooling

我遇到了Hibernate打开大量连接的问题,最终导致我的网络应用无法获得新连接。 起初我以为问题是我在没有连接池的情况下运行,所以我连接了Tomcat JDBC池。

这使问题变得更糟。它不是在一些查询后失败,而是立即失败。 原来这是因为Hibernate试图打开比我的池大小更多的连接(30)。 我检查过,无论我在创建一个EntityManager,我都在调用close(),在一个finally子句中如果有一个尝试,所以我不确定为什么他们保持开放。

查看close()的源代码,我发现如果事务处于打开状态,它实际上并不关闭, 所以我尝试在实体管理器上调用getTransaction()。commit(),即使它只是一个选择的语句。这没有效果。 然后我发现了这个配置标志,并将其打开:
<property name="hibernate.ejb.discard_pc_on_close" value="true" />

这有所不同,当我尝试渲染输出对象时出现异常: 没有懒惰地初始化角色集合:XXX.Comment.attachments,没有会话或会话被关闭

问题似乎是我创建了一些查询来创建一个注释集合,所有这些查询都保持连接打开。 Comment类包含:

@OneToMany
@JoinTable(name = "Object", joinColumns = { @JoinColumn(name = "parentId") }, inverseJoinColumns = { @JoinColumn(name = "id") })
public List<Attachment> getAttachments()
{
    if (attachments == null)
    {
        attachments = new ArrayList<Attachment>();
    }
    return attachments;
}

我会提到这里有一些遗产 Attachment是KObject的子类(db中的表名Object),KObject包含用于映射回Comment的parentId(它也是KObject的子类)。

为了澄清,这是我对实体经理的呼吁:

public <T> T findById(Class<T> objClass, String id)
{
    EntityManager em = theEMF.createEntityManager();
    em.getTransaction().begin();
    try {
        T obj = em.find(objClass, id);
        return obj;
    } catch(NoResultException e) {
        return null;
    } finally {
        em.getTransaction().commit();
        em.clear();
        em.close();
    }   
}

theEMF是一个静态成员变量,在第一次使用时初始化。

我认为解决方案是将其设为@OneToMany(fetch = FetchType.EAGER),但这没有效果。 我做错了什么?

0 个答案:

没有答案