2

Webサイトの休止状態用にc3p0接続プールをセットアップしようとしています。MS SQLデータベースで選択した数の接続を実行すると、min_sizeプロパティで指定された接続の数が2倍になります。ログを調べたところ、接続プールが2回初期化されているように見えることがわかりました。なぜそれが起こり得るのか誰かが知っていますか?

ログ:

[INFO] c3p0.C3P0Registry Initializing c3p0-0.9.1 [built 16-January-2007 14:46:42; 
debug? true; trace: 10]
[INFO] impl.AbstractPoolBackedDataSource Initializing c3p0 pool... 
com.mchange.v2.c3p0.PoolBackedDataSource@bb009603 [ connectionPoolDataSource -> 
com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@6dd5f639 [ acquireIncrement -> 3, 
acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, .......

ここに数行を置いた後、再び次のようになります。

[INFO] impl.AbstractPoolBackedDataSource Initializing c3p0 pool... 
com.mchange.v2.c3p0.PoolBackedDataSource@fbb6bb58 [ connectionPoolDataSource -> 
com.mchange.v2.c3p0.Wrap......

私のHibernateプロパティ(部分的):

<property name="hibernate.connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:jtds:sqlserver://192.168.0.67:1433/SSS2;instanceName=SQLEXPRESS;</property>
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="hibernate.connection.username">DEV</property>
<property name="hibernate.connection.password">123</property>
<property name="hbm2ddl.auto">validate</property>

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory</property>

<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">6</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.timeout">300</property>


<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.idle_test_period">100</property>

<mapping class="***.entities.User" />
<mapping class="***.entities.UserRole" />
<mapping class="***.entities.AccountType" />

Maven POM(部分的):

<dependency>
    <groupId>org.apache.tapestry</groupId>
    <artifactId>tapestry-hibernate</artifactId>
    <version>${tapestry-release-version}</version>
</dependency>

<!-- Hibernate c3p0 connection pool -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>${hibernate-c3p0-version}</version>
</dependency>

-------
<tapestry-release-version>5.3.3</tapestry-release-version>
<hibernate-c3p0-version>3.6.0.Final</hibernate-c3p0-version>

トランザクションごとにセッションファクトリを使用してHibernateセッションを作成し、try-catchステートメントのfinallyブロックで閉じます。(HibernateFactoryは、必要に応じてファクトリをビルドし、セッションを開きます)

protected <T> List <T> findAll(Class<T> clazz) {
    List <T> objects = null;
    Session session = HibernateFactory.openSession();
    Transaction tx = session.beginTransaction();
    try {   
        Query query = session.createQuery("from "+clazz.getName()+" as user left join fetch user.userRole");            
        objects = query.list();
        tx.commit();
    } catch (HibernateException e) {
        handleException(e, tx);
    } finally {
        HibernateFactory.close(session);
    }
    return objects;
}

関連リンク:

  1. https://forum.hibernate.org/viewtopic.php?f=1&t=937286&sid=42b4645f9e9e037d876194e15f9b2f77
  2. https://forum.hibernate.org/viewtopic.php?f=1&t=941919
4

1 に答える 1

0

「hbm2ddl.auto」パラメーターが二重の初期化を強制していると思います... hibernate cfg ファイルから検証を削除してみてください。タペストリーはセッションを 1 回だけ初期化する必要があります。

于 2012-06-26T22:26:38.570 に答える