Hibernate 3.2和apache dbcp吃掉postgres连接

时间:2012-08-06 00:25:17

标签: hibernate apache-commons-dbcp

我有一个简单的实体bean并使用hibernate 3.2.5将其持久化为postgres,prod将是pg 8.4,而我目前在9.1上开发。我使用apache commons dbcp 1.4(和commons pool 1.5.4)公共类DBCPConnectionProvider实现ConnectionProvider,因为它来自网络http://wiki.apache.org/commons/DBCP/Hibernate

之前我使用过c3po和mysql而不是dbcp。现在我得到

引起:org.hibernate.exception.GenericJDBCException:无法打开连接

引起:org.postgresql.util.PSQLException:致命错误:剩余的连接插槽是为非复制超级用户连接保留的

之前使用mysql / c3po,我遇到了类似的错误。

目前persistence.xml属性如下所示:

  <property name="hibernate.connection.username" value="marin-legacy"/>
  <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
  <property name="hibernate.connection.password" value="marin-legacy"/>
  <property name="hibernate.connection.url" value="jdbc:postgresql://localhost/database"/>
  <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
  <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
  <property name="show_sql" value="true"/>

  <property name="hibernate.connection.provider_class" value="vinter2010.persistence.DBCPConnectionProvider"/>
  <property name="hibernate.dbcp.initialSize" value="1"/>
  <property name="hibernate.dbcp.maxActive" value="5"/>
  <property name="hibernate.dbcp.maxIdle" value="5"/>
  <property name="hibernate.dbcp.minIdle" value="1"/>

使用这个我希望dbcp保持5个连接打开并重新分配给javacode。

目前我有一个插入记录的servlet。它成功的插入次数大致等于postgresql.conf中的max_connections数,即100.之后,它会因上述错误而失败。目前,servlet由循环apx运行350次的客户端调用,在每个循环中为servlet发布一行存储。

如果我在没有dbcp或其他池的情况下运行,我会得到相同的异常,只有更改是由hibernate抛出而不是dbcp。

我原本希望dbcp只分配5个连接,而hibernate一次只能打开和关闭一个连接。

实际代码非常简单,基本上由netbeans 6.5中的jpa-generator生成。

这是我从servlet调用的create-function(Netbeans的代码):

    public void create(WebOrderWinter2 webOrderWinter2) {
    EntityManager em = null;
    try {
        em = getEntityManager();
        em.getTransaction().begin();
        em.persist(webOrderWinter2);
        em.getTransaction().commit();
    } finally {
        if (em != null) {
            em.close();
        }
    }
}

实体bean同样是标准的,基本上就像Netbeans生成它一样,它运行完美,无法想象那里存在连接问题。我似乎有一些代码/配置使Hibernate否决了连接池配置,并让池打开新连接而不是重用旧连接。有人在这里有任何线索吗?

0 个答案:

没有答案