- 每一个数据库所存储的数据性质不同,比如数据库A存储重要的交易信息,数据库B存储次要的系统管理信息等等, 如果要访问交易信息,那么通常可以明确指定使用对应数据库A的dataSourceA进行数据访问;如果要访问系统管理信息,则明确指定使用对应数据库B的dataSourceB,其他依次类推。
- 每一个数据库分别承担不同的数据访问请求形式,比如数据库A只允许更新操作不允许查询,数据库B只允许查询不允许更新等, 这个时候,也是可以明确指定使用哪一个dataSource进行数据访问;
当然,类似的场景并非只有这些,但总的意图是相似的,那就是每一个dataSource的职能对于使用它们的客户端来说足够明确,完全是各自独立使用。 笔者经历的FX项目中就使用了这样的多数据源管理方式。在FX中,设置的MAIN数据库主要存储顾客或者银行与FX Broker之间的交易信息,设置的INFO数据库主要存储汇率以及系统履历之类的信息[32]。 通常情况下,针对交易以及汇率之间的信息存储在逻辑上是可以分开进行的,所以现在,应用程序对应的spring配置内容基本如下:
<bean id="mainDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="url" value="${main.jdbcUrl}"/>
<property name="driverClassName" value="${main.driver}"/>
<property name="username" value="${main.username}"/>
<property name="password" value="${main.passwork}"/>
<!-- other property settings -->
</bean>
<bean id="infoDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="url" value="${info.jdbcUrl}"/>
<property name="driverClassName" value="${info.driver}"/>
<property name="username" value="${info.username}"/>
<property name="password" value="${info.password}"/>
<!-- other property settings -->
</bean>
<bean id="mainJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="mainDataSource"/>
</bean>
<bean id="infoJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="infoDataSource"/>
</bean>
<bean id="dataAccessResourceSupport" abstract="true">
<property name="mainJdbcTemplate" ref=""/>
<property name="infoJdbcTemplate" ref=""/>
</bean>
<bean id="someDaoWithMainDS" class="...">
<property name="mainJdbcTemplate" ref="mainJdbcTemplate"/>
<!-- other property settings -->
</bean>
<bean id="someDaoWithInfoDS" class="...">
<property name="infoJdbcTemplate" ref="infoJdbcTemplate"/>
<!-- other property settings -->
</bean>
<bean id="someDaoWithBothDS" class="..." parent="dataAccessResourceSupport">
<!-- other property settings -->
</bean>
项目中这种情况下的多数据源管理是最简单的,也是比较容易管理的方式,所以,在你考虑下面将要谈到的这种更加动态,更加复杂的多数据源管理方式之前, 请先对你的数据访问场景做一个评估,看一下当前这种方式是否已经足够满足项目的数据访问需要,实在不行的话,再考虑后继方案,也就是在运行期间来决定到底使用多个数据源中的哪一个。