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