程序是使用的是spring JdbcTemplate架构,简要记录下配置多数据源的方法:
1,设置数据源:
在application.properties文件中配置多个数据源,示例中我配置了2个数据源,如下:
A、oracle
jdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@1localhost:1521:dev
jdbc.username=ling
jdbc.password=229
B、Mysql
#mysql
jdbc-mysql.driver=com.mysql.jdbc.Driver
jdbc-mysql.url=jdbc:mysql://localhost:3306/test
jdbc-mysql.username=root
jdbc-mysql.password=229
2、配置applicationContext-dataSource.xml
在applicationContext-dataSource.xml文件中获取数据源,程序使用的是jdbcTemplate架构,如下:
<!-- 数据源配置, oracle -->
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
<!-- Connection Info -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- Connection Pooling Info -->
<property name="maxActive" value="${jdbc.pool.maxActive}" />
<property name="maxIdle" value="${jdbc.pool.maxIdle}" />
<property name="minIdle" value="0" />
<property name="defaultAutoCommit" value="false" />
</bean>
<!--mysql数据库,配置如下-->
<bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc-mysql.driver}" />
<property name="url" value="${jdbc-mysql.url}" />
<property name="username" value="${jdbc-mysql.username}" />
<property name="password" value="${jdbc-mysql.password}" />
<property name="maxActive" value="${jdbc.pool.maxActive}" />
<property name="maxIdle" value="${jdbc.pool.maxIdle}" />
<property name="minIdle" value="0" />
<property name="defaultAutoCommit" value="false" />
</bean>
<!-- 动态数据引用类配置 -->
<bean id="dynamicDataSource" class="com.ffcs.itm.web.rocketmq.base.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry value-ref="dataSource" key="dataSource"></entry>
<entry value-ref="mysqlDataSource" key="mysqlDataSource"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource">
</property>
</bean>
<!-- jdbcTemplate配置 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dynamicDataSource" />
</property>
</bean>
3,动态数据源类
从步骤2中,可以看到使用了DynamicDataSource这个类,这是一个动态数据源类
A、DynamicDataSource
public class DynamicDataSource extends AbstractRoutingDataSource{
@Override
protected Object determineCurrentLookupKey() {
return CustomerContextHolder.getCustomerType();
}
}
B、CustomerContextHolder
public class CustomerContextHolder {
public static final String DATA_SOURCE_ORACLE = "dataSource";// oracle 数据源 和 配置的 key 一样
public static final String DATA_SOURCE_MYSQL = "mysqlDataSource";// mysql数据源和配置的key一样 private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setCustomerType(String customerType) {
contextHolder.set(customerType);
}
public static String getCustomerType() {
String dataSource = contextHolder.get();
if (StringUtils.isEmpty(dataSource)) {
return DATA_SOURCE_MYSQL;
} else {
return dataSource;
}
}
public static void clearCustomerType() {
contextHolder.remove();
}
}
4,切换数据源
建立service 切换数据源 最好在服务层切换
A、NodeMysqlService
@Service("nodeMysqlService")
public class NodeMysqlService {
public String getMysqlCommandSeries() throws ApplicationException {
NodeMysqlDao nodeMysqlDao = (NodeMysqlDao) ContextLoader.getCurrentWebApplicationContext().getBean("nodeMysqlDao");
String commonSerials = "";
try {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_MYSQL); // 切换到mysql数据源
commonSerials = nodeMysqlDao.getMysqlCommandSeries();
} catch (Exception e) {
e.printStackTrace();
throw new ApplicationException(e.getMessage());
}finally{
CustomerContextHolder.clearCustomerType();
// 切换到默认数据源
}
return commonSerials;
}
}
B、NodeMysqlDao:
@Component
public class NodeMysqlDao {
private String MYSQL_GET_SEQUENCE = "select branch_id as id fron branch";
@Autowired
private JdbcTemplate jdbcTemplate;
public String getMysqlCommandSeries() throws ApplicationException, SystemException {
String sequence = "";
Map<String, Object> sequenceMap = new HashMap<String,Object>();
try
{
sequenceMap = jdbcTemplate.queryForMap(MYSQL_GET_SEQUENCE);
sequence = Long.toString((Long)sequenceMap.get("id")) ;
} catch (Exception e){
e.printStackTrace();
System.out.println(e.getMessage());
}
return sequence;
}
}
其它业务信息就自己建立。