0

私は使用しています

oracle.ucp.jdbc.PoolDataSource

接続を取得するため。カスタム クラス (歴史的なソリューション) にラップされた各接続。通常、接続はentityManagerによって取得されます。私のシステムは高性能処理を必要とします。そのために使用する ThreadPool があります。スレッド プールは、接続プールと同様に、同時に15のスレッドを提供できます。すべてが正常に動作しますが、例外が発生することがあります (この時点では 4 つの接続のみが使用されていました)。

2012-09-26 17:51:45.835 | ERROR | ThreadExecutor-7 | org.hibernate.ejb.AbstractEntityManagerImpl | Exception in thread "ThreadExecutor-7"
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1235)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168)
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1245)
    at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:63)
    ...
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
    at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1463)
    at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:60)
    ...
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)

システムの指定されたgetConnectionパフォーマンスを同期すると、8〜12回ダウンします。

修正のアイデアはありますか?

4

1 に答える 1

0

に適切な値を設定していることを確認してください

 <property name="minPoolSize" value="5"/>
 <property name="maxPoolSize" value="100"/>//Change if you want
 <property name="initialPoolSize" value="5"/>
 <property name="validateConnectionOnBorrow" value="true"/>
 <property name="maxStatements" value="10"/>

ここで構成を確認できます

休止状態で接続プールを変更する必要があります。

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html

ただし、Hibernate 独自の接続プーリング アルゴリズムは非常に初歩的なものです。これは、作業の開始を支援することを目的としており、実稼働システムでの使用やパフォーマンス テストを目的としたものではありません。最高のパフォーマンスと安定性を得るには、サードパーティのプールを使用する必要があります。hibernate.connection.pool_size プロパティを接続プール固有の設定に置き換えるだけです。これにより、Hibernate の内部プールがオフになります。たとえば、c3p0 を使用したい場合があります。

hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
于 2012-09-26T17:12:47.973 に答える