9

Hibernate アプリケーションで c3p0 接続プールの初期化に 2 分かかる理由がわかりません。

これは私の Hibernate.cfg.xml にあります:

<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">org.postgresql.Driver</property>
        <property name="connection.url"/>
        <property name="connection.default_schema"/>
        <property name="connection.username"/>
        <property name="connection.password"/> 

        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
        <property name="current_session_context_class">thread</property>

        <property name="hibernate.c3p0.acquire_increment">1</property>
        <property name="hibernate.c3p0.min_size">3</property>
        <property name="hibernate.c3p0.max_size">10</property>
        <property name="hibernate.c3p0.timeout">300</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <property name="hibernate.c3p0."></property>

        <property name="show_sql">true</property>
        <property name="format_sql">false</property>

        <property name="hbm2ddl.auto">create</property>
 </session-factory>
</hibernate-configuration>

接続設定は、セッション ファクトリをビルドするときに HibernateUtil ファイルに設定されます。

テストの最初のトランザクションが openend のときにプールが初期化されます。その後、データベースへの接続とクエリは問題なく機能します。開始する前に、次の行でしばらくハングするだけです。ここに記載されている設定のいずれかに問題がある可能性があるため、出力を少しフォーマットしました。

INFO: Initializing c3p0 pool... 
com.mchange.v2.c3p0.PoolBackedDataSource@30670080 [
  connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@ecfec4d0 [
    acquireIncrement -> 1,
    acquireRetryAttempts -> 30,
    acquireRetryDelay -> 1000,
    autoCommitOnClose -> false,
    automaticTestTable -> null,
    breakAfterAcquireFailure -> false,
    checkoutTimeout -> 0,
    connectionCustomizerClassName -> null,
    connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester,        
    debugUnreturnedConnectionStackTraces -> false,
    factoryClassLocation -> null,
    forceIgnoreUnresolvedTransactions -> false,
    identityToken -> I-REMOVED-THIS,
    idleConnectionTestPeriod -> 3000,
    initialPoolSize -> 3,
    maxAdministrativeTaskTime -> 0,
    maxConnectionAge -> 0,
    maxIdleTime -> 300,
    maxIdleTimeExcessConnections -> 0,
    maxPoolSize -> 10,
    maxStatements -> 50,
    maxStatementsPerConnection -> 0,
    minPoolSize -> 3,
    nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@b17e5c65 [
      description -> null,
      driverClass -> null,
      factoryClassLocation -> null,
      identityToken -> I-REMOVED-THIS,
      jdbcUrl -> jdbc:postgresql://URL-TO-MY_DB,
      properties -> {user=******, password=******, default_schema=}
    ],
    preferredTestQuery -> null,
    propertyCycle -> 0,
    testConnectionOnCheckin -> false,
    testConnectionOnCheckout -> false,
    unreturnedConnectionTimeout -> 0,
    usesTraditionalReflectiveProxies -> false;
    userOverrides: {}
  ],
  dataSourceName -> null,
  factoryClassLocation -> null,
  identityToken -> I-REMOVED-THIS,
  numHelperThreads -> 3
]

Hibernate と c3p0 を使用するのはこれが初めてで、プールを開始するときにもっと速くなると思っていましたか? それは私の誤解ですか?

リモート DB を使用する場合も、ローカル PostgreSQL インスタンスを使用する場合も違いはありません。

(編集:これは真実ではありません。ローカルとリモートのdbサーバーを比較するときに間違いを犯しました。ローカルでは初期化はすぐに完了しますが、リモートでは約2分かかります。)

Edit2:これ接続プロセスのログです。

4

1 に答える 1

9

セッション ファクトリの構成でプロパティ Hibernate.temp.use_jdbc_metadata_defaults を false に設定します。これは、接続の代わりにメタデータ ダイアレクトを使用して Hibernate に指示するため、起動が遅くなります。また、ドライバーに適切なダイアレクトを構成する必要があります。

于 2014-04-08T14:01:47.437 に答える