2012-10-16 58 views
3

我在想,如果我能爲一個數據庫運行多個數據源C3P0,像:我可以爲數據庫實例使用多個C3P0數據源嗎?

<bean id="dataSource1" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="${db.driverClassName}"/> 
    <property name="jdbcUrl" value="${db.url}/schema1"/> 
    <property name="user" value="${db.username}"/> 
    <property name="password" value="${db.password}"/> 

    <property name="acquireIncrement" value="1" /> 
    <property name="idleConnectionTestPeriod" value="100"/> 
    <property name="minPoolSize" value="5" /> 
    <property name="maxPoolSize" value="50" /> 
    <property name="maxIdleTime" value="1800" /> 
</bean> 

<bean id="dataSource2" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="${db.driverClassName}"/> 
    <property name="jdbcUrl" value="${db.url}/schema2"/> 
    <property name="user" value="${db.username}"/> 
    <property name="password" value="${db.password}"/> 

    <property name="acquireIncrement" value="1" /> 
    <property name="idleConnectionTestPeriod" value="100"/> 
    <property name="minPoolSize" value="5" /> 
    <property name="maxPoolSize" value="50" /> 
    <property name="maxIdleTime" value="1800" /> 
</bean> 

他們將通過差異持久性服務使用。

謝謝。

回答

5

這絕對沒問題。你會碰到一些配置問題,如:按類型

  • 自動裝配DataSource將無法​​正常工作

  • @Transactional /聲明式事務將只針對一個,選擇DataSource。另外,您必須手動告訴你想要的事務管理器使用(因此你需要兩個事務管理器,以及:transactionManager1transactionManager2):

    @Transactional("transactionalManager2") 
    

除此之外,沒有什麼不對的配置。實際上這是個不錯的主意(+1):如果應用程序的某些層/組件飽和了池,其他層仍可以運行。

我推薦的唯一的事情就是用鮮爲人知abstract/parent bean聲明,以避免重複:

<bean id="dataSource" abstract="true" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="${db.driverClassName}"/> 
    <property name="user" value="${db.username}"/> 
    <property name="password" value="${db.password}"/> 
    <property name="acquireIncrement" value="1" /> 
    <property name="idleConnectionTestPeriod" value="100"/> 
    <property name="minPoolSize" value="5" /> 
    <property name="maxPoolSize" value="50" /> 
    <property name="maxIdleTime" value="1800" /> 
</bean> 

<bean id="dataSource1" parent="dataSource"> 
    <property name="jdbcUrl" value="${db.url}/schema1"/> 
</bean> 
<bean id="dataSource2" parent="dataSource"> 
    <property name="jdbcUrl" value="${db.url}/schema2"/> 
</bean> 

參見:

+0

我不使用自動裝配。我手動定義applicationContext.xml文件中的依賴關係。我有這樣的依賴關係圖:'MessageService => MessageDAO => sessionFactory => dataSource1'和'PersonService => PersonDAO => sessionFactory => dataSource2'。這兩個服務都具有函數的'@ Transactional'聲明。我希望這可以工作。謝謝。 – scabbage

+0

@ scabbage:那麼它將「只是工作」。不過,請參閱我在@ Transactional上的更新。 –

相關問題