0

我有一个简单的实体 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 个连接,而休眠一次只打开和关闭一个连接。

实际代码很简单,基本都是netbeans 6.5中的jpa-generator生成的。

这是我从我的 servlet 调用的创建函数(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 否决了连接池配置并让池打开新连接而不是重用旧连接。有人在这里有任何线索吗?

4

0 回答 0