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

10

我无法理解为什么在我的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文件中设置了连接设置。

当我的测试中打开第一个事务时,池被初始化。连接和查询数据库之后都能工作得很好,只是在启动后面的行之前会稍微停顿一下。我对输出进行了格式化,因为我认为问题可能出现在这里提到的某个设置上。

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:这里是连接过程的日志。


您好。首先,您正在使用哪个版本的c3p0?如果您正在使用c3p0-0.9.1.x,可以尝试升级到最新版本(c3p0-0.9.2-pre8)。关于您的设置:请选择一个大于1的acquireIncrement(默认值为3可能已经足够),考虑到您的连接池大小。如果将acquireRetryDelay设置为较低的值可以加速初始化,则表示c3p0偶尔在连接获取方面出现故障。(如果您将记录器的级别设置为com.mchange.v2.resourcepool.BasicResourcePool的FINE或DEBUG,则会看到这些故障。) - Steve Waldman
我在比较本地和远程数据库服务器的初始化时犯了一个错误。对于造成的困惑,我感到抱歉。在本地,初始化几乎是立即完成的,而在远程则需要大约2分钟的时间。我使用了Heroku Dev实例的Postgres进行测试。这是否仍然是一个不寻常的长时间? - bentrm
@SteveWaldman c3p0的日志设置为debug,我找不到一种方法来获得更精细的init和连接过程的日志记录。你能否提供一些提示,如何启用com.mchange.v2.resourcepool.BasicResourcePool的日志记录? - bentrm
1
这取决于你的日志库 -- com.mchange.v2.resourcepool.BasicResourcePool 是你想要启用更详细日志记录器的日志记录器。如果你正在使用Java标准日志记录库,应该有一个logging.properties文件。如果你正在使用log4j,则是log4j.properties。c3p0在启动时会转储它正在使用的日志框架,查找类似于“MLog clients using”的行,然后是标识日志库的字符串。 - Steve Waldman
@SteveWaldman 我编辑了我的帖子并附上了日志。如果有人能看一下就好了。 - bentrm
显示剩余4条评论
1个回答

12

在会话工厂的配置中将属性hibernate.temp.use_jdbc_metadata_defaults设置为false(文档)。这将告诉Hibernate使用元数据方言而不是连接,从而加快启动速度。您还必须为您的驱动程序配置适当的方言。


12
提醒其他看到这条信息的人:如果你和我一样遇到了类似问题,请确保你的数据库正在运行,否则 c3p0 的初始化将会一直挂起。;) - Nick Redmark
@NicolaMarcacciRossi 你所说的数据库正在运行是什么意思?你是指已经连接到了数据库吗? - Yigit Alparslan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接