2012-10-16 60 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上的更新。 –

相关问题