2013-01-19 56 views
4

我不能換我周圍爲什麼c3p0連接的初始化需要2分鐘在我的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... 
[email protected] [ 
    connectionPoolDataSource -> [email protected] [ 
    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 -> [email protected] [ 
     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分鐘左右。)

EDIT2:Here是一個日誌的連接過程。

+0

通常它應該是「immidiatly」。也許嘗試另一個池庫以確保它是一個c3p0問題,如BoneCP(http://jolbox.com/)。 – Adrian

+0

嗨。首先,你使用的是什麼版本的c3p0?如果您使用的是c3p0-0.9.1.x,您可以嘗試升級到最新版本(c3p0-0.9.2-pre8)嗎?重新設置你的設置:請選擇一個大於1的acquireIncrement(默認值爲3可能沒問題,給定池大小)。您可能會嘗試將acquireRetryDelay設置爲較低的值 - 如果這會加快您的初始化速度,則意味着c3p0偶爾會出現連接採集失敗的情況。 (如果你設置了記錄器com.mchange.v2.resourcepool.BasicResourcePool罰款或DEBUG的水平,你會看到這些失敗)。 –

+0

我的本地和遠程數據庫服務器上比較初始化時犯了一個錯誤。 Sry,感到困惑。在本地,初始化非常快,大約需要2分鐘。我用Postgre的Heroku Dev實例對它進行了測試。這仍然是一個非典型的漫長的時間? – bentrm

回答

7

設置屬性Hibernate.temp.use_jdbc_metadata_defaults爲false會話工廠的配置。這將向Hibernate使用元數據方言而不是連接進行指示,這會導致啓動緩慢。您還必須爲您的驅動程序配置適當的方言。

+8

只是爲了和我一樣在這裏降落的其他人的注意事項:確保你的數據庫正在運行,否則c3p0初始化將永遠掛起;) –