2014-02-24 41 views
0

我使用spring(DB2,C3P0)的休眠模板Hibernate會話在啓動時未初始化

應用程序啓動但連接未打開。 第一次從客戶端c3p0進行查詢後,init啓動並實際打開連接。但是這需要2-3秒才能顯示出在自己的啓動過程中第一個客戶端的速度變慢。

如何強制休眠在啓動時打開數據庫?

代碼[編輯]

<bean id=hibernateproperties > 
<property name="properties"> 
    <props> 
    <prop key="hibernate hbm2ddl|dialect|query.substitutions|show_sql </prop> 
    <prop key="hibernate.c3po.minPoolSize">1</prop> 
    <prop key="hibernate.c3po.maxPoolsize">5</prop> 
    <prop key="hibernate.c3po.timeout">500</prop> 
    <prop key="hibernate.c3po.max_statements">50</prop> 
    <prop key="hibernate.c3po.testconnectionOnCheckout">true</prop> 
    <prop key="hibernate.c3po.minActive">1</prop> 
</property> 
</bean> 
<bean id=sessionfactory 
    class=AnnotationSessionFactory 
    properties=hibernateproperties 
    dataSource=c3p0dataSource> 
    <property name="packagesToScan" > 
     <list> 
      <value>myPackages</value> 
     </list> 
    </property> 
</bean> 

在日誌中沒有C3P0直到我手動創建查詢初始化。

[編輯] 我調試代碼,並調用SessionFactory.getSession()時,它會發現該會話並沒有創建和初始化與c3p0會話。在實際查詢之前,有日誌行 初始化c3p0池(帶類和選項)。 我猜AnnotationSessionFactory對會話init使用懶惰的方法。

注: 我設置的彈簧懶豆初始化爲false

+1

代碼在哪裏? –

+0

你在服務器中使用它嗎? –

+0

@AdamArold感謝您的支持。代碼部分在某種程度上是不可見的。現在它應該被修復。 – pnemec

回答

0

C3P0似乎不支持熱身。因此,可能的選項之一是將c3p0配置爲永不關閉少量連接,並在應用程序啓動時手動預熱。

您可能需要設置maxIdleTimeExcessConnections選項,以便c3p0關閉額外的空閒連接並將minPoolSize設置爲某個較小的值(默認值爲3)。

使用任何方法來執行後期初始化操作:beans post processor,任何對數據源有依賴關係的start-up callbacks

此操作應該打開連接,然後關閉它:這將創建一個(或更多取決於c3p0 acquireIncrement參數)連接並將其放回池中。下面是使用@PostConstruct註釋的示例:

@Service 
class C3P0Warmer { 
    @Autowired DataSource dataSource; 

    @PostConstruct 
    public warmup() { 
     JdbcUtils.closeConnection(dataSource.getConnection()); 
    } 
} 
+0

c3p0甚至沒有啓動。因爲我沒有將它配置爲獨立的DataSource。 我將c3p0配置直接注入會話,它將處理數據源。不過,我使用完全相同的方法來請求觸發初始化的會話 - 我認爲這是一種黑客攻擊並尋找更好的方法。 這是很好的提示。我會嘗試讓c3po成爲獨立的DS並試用。 – pnemec

相關問題