java - 初始化 C3P0 连接池需要 2 分钟

标签 java hibernate c3p0

我无法理解为什么在我的 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>

连接设置是在构建 session 工厂时在我的 HibernateUtil 文件中设置的。

当我测试中的第一个事务是开放式时,池就初始化了。 之后连接和查询数据库就可以正常工作,它只会在下一行挂起一段时间才能开始。我对输出进行了一些格式化,因为我认为问题可能出在此处提到的设置之一。:

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,我希望它在启动池时更快?是我的错觉吗?

使用远程数据库和本地 PostgreSQL 实例没有区别。

(编辑:这不是真的。我在比较本地和远程数据库服务器时犯了一个错误。在本地,初始化几乎是立即进行的,远程则需要大约 2 分钟。)

编辑 2:Here是连接过程的日志。

最佳答案

在 session 工厂的配置中将属性 hibernate.temp.use_jdbc_metadata_defaults 设置为 false (documentation)。这将向 Hibernate 指示使用元数据方言而不是连接,这会导致启动缓慢。您还必须为您的驱动程序配置适当的方言。

关于java - 初始化 C3P0 连接池需要 2 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14417692/

相关文章:

java - 无法将 spring-boot WAR 部署到 Elastic Beanstalk

java - com.ximpleware 解析 XML - XPath - ==> 末尾或附近的语法错误

java - Hibernate 继承 - 获取父类(super class)实例并转换为子类

java - 如何在加载数据时检查 Hibernate 是否正在使用数据库索引

mysql - Hibernate 在持久化对象时编码错误 [UTF-8]

mysql - c3p0 打桩连接对象

java - Windows 上的 "lo"接口(interface)等效项是什么

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

java - 如何使用 Hibernate/JPA 检测打开的数据库连接?

java - 如何为 c3p0 设置 getConnection() 超时?