这篇文章是配置mybatis多数据源文章,如果是hibernate的话也是没什么影响,配置都是差不多的。

在这家公司上班差不多一星期了,不小心点开配置文件一看这项目配置了两个数据源,蒙了。

之后上网查了下,自己写了个demo,恍然大悟

还是那句话,当你理解了才知道是怎么回事,动手写一遍才能体会到。

先说说配置吧。

这是配置单个数据源配置文件

<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>

这是配置多个数据源配置文件

<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>

其实一眼都可以看出来,就是多了个数据源,理解为备用,

defaultTargetDataSource表示默认的数据源。
targetDataSources是一个map集合,返回类型为DataSource,虽然没看,也没必要看。
MultipleDataSource是自己定义的一个类,实现方式请看下面代码
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,其他操作时一模一样的,自己可以写一个测试类

@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

小白一个,后面路还很长。勿忘初心

spring配置多数据源——mybatis的更多相关文章

  1. Spring配置动态数据源-读写分离和多数据源

    在现在互联网系统中,随着用户量的增长,单数据源通常无法满足系统的负载要求.因此为了解决用户量增长带来的压力,在数据库层面会采用读写分离技术和数据库拆分等技术.读写分离就是就是一个Master数据库,多 ...

  2. 通过spring抽象路由数据源+MyBatis拦截器实现数据库自动读写分离

    前言 之前使用的读写分离的方案是在mybatis中配置两个数据源,然后生成两个不同的SqlSessionTemplate然后手动去识别执行sql语句是操作主库还是从库.如下图所示: 好处是,你可以人为 ...

  3. Spring配置c3p0数据源时出错报:java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector

    今天在使用Spring配置c3p0数据源时,使用的数据库是mysql,服务器是tomcat,运行时报了一个 java.lang.NoClassDefFoundError: com/mchange/v2 ...

  4. 使用Spring配置动态数据源实现读写分离

    最近搭建的一个项目需要实现数据源的读写分离,在这里将代码进行分享,以供参考.关键词:DataSource .AbstractRoutingDataSource.AOP 首先是配置数据源 <!-- ...

  5. 使用 Spring 配置动态数据源实现读写分离

    关键词:DataSource .AbstractRoutingDataSource.AOP 首先是配置数据源 <!--读数据源配置--><bean id="readData ...

  6. 阿里P7教你如何使用 Spring 配置动态数据源实现读写分离

    最近搭建的一个项目需要实现数据源的读写分离,在这里将代码进行分享,以供参考. 关键词:DataSource .AbstractRoutingDataSource.AOP 首先是配置数据源 <!- ...

  7. Spring配置多数据源错误总结

    由于系统需要调用多个数据源包含mysql,sqlServe和Oracle,所以要在Spring的xml文件中配置多数据源,一下是配置过程中常见的错误: 1.配置的是mysql的数据源,却报oracle ...

  8. Spring配置DataSource数据源

    在Spring框架中有例如以下3种获得DataSource对象的方法: 1.从JNDI获得DataSource. 2.从第三方的连接池获得DataSource. 3.使用DriverManagerDa ...

  9. Spring 配置JNDI数据源

    1.Spring 提供的JNDI调用类. 2.使用weblogic进行部署项目,所以使用WebLogicNativeJdbcExtrator类进行配置. 3.配置完数据源后配置sessionFacto ...

随机推荐

  1. bzoj 2820 / SPOJ PGCD 莫比乌斯反演

    那啥bzoj2818也是一样的,突然想起来好像拿来当周赛的练习题过,用欧拉函数写掉的. 求$(i,j)=prime$对数 \begin{eqnarray*}\sum_{i=1}^{n}\sum_{j= ...

  2. Linux type命令的用法

    一般情况下,type命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法. 1.判断一个名字当前是否是alias.keyword.function.builtin.file或者什么都不是 ...

  3. JAVA中反射机制三

    声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射三 利用反射获取对象的方法,并调用方法 1.利用反射获取对象的方法,我们仍然利用上面的Person类, ...

  4. MongoDB - MongoDB CRUD Operations, Query Documents, Iterate a Cursor in the mongo Shell

    The db.collection.find() method returns a cursor. To access the documents, you need to iterate the c ...

  5. Django之利用ajax实现图片预览

    利用ajax实现图片预览的步骤为: 程序实现的方法为: 方法一: upload.html <!DOCTYPE html> <html lang="en"> ...

  6. C++之C/C++内存对齐

    一.什么是字节对齐,为什么要对齐 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这 ...

  7. 在Nginx服务器上屏蔽IP

    采集和防止采集是一个经久不息的话题,一方面都想搞别人的东西,另一方面不想自己的东西被别人搞走. 本文介绍如何利用nginx屏蔽ip来实现防止采集,当然也可以通过iptable来实现. 1.查找要屏蔽的 ...

  8. Gym 101081K Pope's work

    题目链接:Gym - 101081K 题意:给n个箱子,每个箱子有一个重量W和一个承重R,表示它上面能放最多R-W的重量.问最多能把多少箱子堆到一堆. 思路:发现在一堆箱子里,两个箱子交换位置,对其他 ...

  9. linux动态库编译和使用详细剖析 - 后续

    引言 - 也许是修行 很久以前写过关于动态库科普文章, 废话反正是说了好多. 核心就是在 linux 上面玩了一下 dlopen : ) linux动态库编译和使用详细剖析 - https://www ...

  10. 2017百度春招<有趣的排序>

    题目 度度熊有一个N个数的数组,他想将数组从小到大排好序,但是萌萌的度度熊只会下面这个操作:任取数组中的一个数然后将它放置在数组的最后一个位置.问最少操作多少次可以使得数组从小到大有序? #inclu ...