我有一个简单的实体 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 否决了连接池配置并让池打开新连接而不是重用旧连接。有人在这里有任何线索吗?