这篇文章是配置mybatis多数据源文章,如果是hibernate的话也是没什么影响,配置都是差不多的。
在这家公司上班差不多一星期了,不小心点开配置文件一看这项目配置了两个数据源,蒙了。
之后上网查了下,自己写了个demo,恍然大悟
还是那句话,当你理解了才知道是怎么回事,动手写一遍才能体会到。
先说说配置吧。
这是配置单个数据源配置文件
代码语言:javascript复制<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root"></property>
<property name="password" value="123"></property>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false"></property>
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
</bean>
<!-- 配置跟Mybatis整合 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
这是配置多个数据源配置文件
代码语言:javascript复制<bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root"></property>
<property name="password" value="123"></property>
<property name="jdbcUrl"
value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false"></property>
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
</bean>
<bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root"></property>
<property name="password" value="123"></property>
<property name="jdbcUrl"
value="jdbc:mysql://127.0.0.1:3306/test?useSSL=false"></property>
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
</bean>
<bean id="multipleDataSource" class="com.bscc.datasource.MultipleDataSource">
<property name="defaultTargetDataSource" ref="dataSource1" />
<property name="targetDataSources">
<map>
<entry key="dataSource1" value-ref="dataSource1" />
<entry key="dataSource2" value-ref="dataSource2" />
</map>
</property>
</bean>
<!-- 配置跟Mybatis整合 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="multipleDataSource"></property>
</bean>
其实一眼都可以看出来,就是多了个数据源,理解为备用,
代码语言:javascript复制defaultTargetDataSource表示默认的数据源。
代码语言:javascript复制targetDataSources是一个map集合,返回类型为DataSource,虽然没看,也没必要看。
代码语言:javascript复制MultipleDataSource是自己定义的一个类,实现方式请看下面代码
代码语言:javascript复制import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class MultipleDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>();
public static void setDataSourceKey(String dataSource) {
dataSourceKey.set(dataSource);
}
@Override
protected Object determineCurrentLookupKey() {
String string = dataSourceKey.get();
return string;
}
}
就是这么回事,继承abstract柔婷DataSource类即可,重写determinecurrentlookupkey抽象方法,是需要返回对应的数据源名称,也就是DataSource1,DataSource2罢了。
之所以需要定义一个threadlocal集合,是为了防止并发操作,兴许是瞎说,可以自行百度,只可意会
OK,其他操作时一模一样的,自己可以写一个测试类
代码语言:javascript复制@RequestMapping("listPerson")
@ResponseBody
public List<Person> listPerson() {
List<Person> list = service.listPerson();
return list;
}
@RequestMapping("listPerson2")
@ResponseBody
public List<Person> listPerson2() {
MultipleDataSource.setDataSourceKey("dataSource2");
List<Person> list = service.listPerson();
return list;
}
访问这两个controller,对应不同的数据库。 这么写是给写死了,不过想写成动态的话可以根据自己的业务策略来,也可以通过aop配置。 虽然写的不多,但写的都是操作方式,毕竟不难,照着操作一遍,就什么都懂了。OK
小白一个,后面路还很长。勿忘初心