私は単純なエンティティ Bean を持っており、休止状態 3.2.5 を使用してそれを postgres に永続化します。prod は pg 8.4 になりますが、現在は 9.1 で開発しています。私はApache commons dbcp 1.4(およびcommons pool 1.5.4)を使用しています。パブリッククラスDBCPConnectionProviderは、Web http://wiki.apache.org/commons/DBCP/HibernateからgoogledとしてConnectionProviderを実装しています
以前は、dbcp の代わりに c3po と mysql を使用していました。今私は得る
原因: org.hibernate.exception.GenericJDBCException: 接続を開けません
と
原因: org.postgresql.util.PSQLException: FATAL: 残りの接続スロットは非レプリケーション スーパーユーザー接続用に予約されています
以前に 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 に再割り当てすることが期待できます。
現在、レコードを挿入するサーブレットがあります。postgresql.conf の max_connections の数 (100) とほぼ同じ数の挿入で成功します。その後、上記のエラーで失敗します。現在、サーブレットは、ループ apx で 350 回実行されるクライアントによって呼び出され、各ループでサーブレット用に格納する行を 1 つポストします。
dbcp または他のプールなしで実行すると、同じ例外が発生します。唯一の変更点は、dbcp ではなく休止状態によってスローされることです。
私は、dbcp が 5 つの接続を割り当てるだけで、ハイバネートして一度に 1 つの接続だけを開いたり閉じたりすることを期待していました。
実際のコードは非常に単純で、基本的に netbeans 6.5 の jpa-generator によって生成されます。
これは、サーブレット (Netbeans によるコード) から呼び出す create-function です。
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 が接続プールの構成を無効にし、プールが古い接続を再利用する代わりに新しい接続を開くようにするコード/構成があるようです。ここに手がかりはありますか?