Spring+Mybatis多数据库的配置

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

场景:在Spring+Mybatis搭建的项目中要配置两个数据库,如何实现?

    其实也不是多难的事情,只要把配置配好了,一切问题就迎刃而解了,废话不多说,且看

如下配置……


配置一:jdbc.properties

配置两个数据库:myuser和myitem

1
2
3
4
5
6
7
8
9
myuser.jdbc.driver=com.mysql.jdbc.Driver
myuser.jdbc.url=jdbc:mysql: //192.168.1.100:3306/myuser?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
myuser.jdbc.username=root
myuser.jdbc.password= 123456
 
myitem.jdbc.driver=com.mysql.jdbc.Driver
myitem.jdbc.url=jdbc:mysql: //192.168.1.100:3306/myitem?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
myitem.jdbc.username=root
myitem.jdbc.password= 123456

配置二:applicationContext.xml

配置:

    两个数据源(myUserDataSource和myItemDataSource)、

    一个动态的DataSource(dynamicDataSource);

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
       <!-- 数据库连接池 1  :myuser-->
     <bean id= "myUserDataSource"  class = "com.jolbox.bonecp.BoneCPDataSource"
         destroy-method= "close" >
         <!-- 数据库驱动 -->
         <property name= "driverClass"  value= "${myuser.jdbc.driver}"  />
         <!-- 相应驱动的jdbcUrl -->
         <property name= "jdbcUrl"  value= "${myuser.jdbc.url}"  />
         <!-- 数据库的用户名 -->
         <property name= "username"  value= "${myuser.jdbc.username}"  />
         <!-- 数据库的密码 -->
         <property name= "password"  value= "${myuser.jdbc.password}"  />
         <!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值: 240 ,如果要取消则设置为 0  -->
         <property name= "idleConnectionTestPeriod"  value= "60"  />
         <!-- 连接池中未使用的链接最大存活时间,单位是分,默认值: 60 ,如果要永远存活设置为 0  -->
         <property name= "idleMaxAge"  value= "30"  />
         <!-- 每个分区最大的连接数 -->
         <property name= "maxConnectionsPerPartition"  value= "150"  />
         <!-- 每个分区最小的连接数 -->
         <property name= "minConnectionsPerPartition"  value= "5"  />
     </bean>
     <!-- 数据库连接池 2  :myitem-->
     <bean id= "myItemDataSource"  class = "com.jolbox.bonecp.BoneCPDataSource"
         destroy-method= "close" >
         <!-- 数据库驱动 -->
         <property name= "driverClass"  value= "${myitem.dbc.driver}"  />
         <!-- 相应驱动的jdbcUrl -->
         <property name= "jdbcUrl"  value= "${myitem.jdbc.url}"  />
         <!-- 数据库的用户名 -->
         <property name= "username"  value= "${myitem.jdbc.username}"  />
         <!-- 数据库的密码 -->
         <property name= "password"  value= "${myitem.jdbc.password}"  />
         <!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值: 240 ,如果要取消则设置为 0  -->
         <property name= "idleConnectionTestPeriod"  value= "60"  />
         <!-- 连接池中未使用的链接最大存活时间,单位是分,默认值: 60 ,如果要永远存活设置为 0  -->
         <property name= "idleMaxAge"  value= "30"  />
         <!-- 每个分区最大的连接数 -->
         <property name= "maxConnectionsPerPartition"  value= "150"  />
         <!-- 每个分区最小的连接数 -->
         <property name= "minConnectionsPerPartition"  value= "5"  />
     </bean>
 
     
     
     <!-- 数据库连接池 -->
     <bean id= "dynamicDataSource"  class = "com.simple.sso.dynamicdatasource.DynamicDataSource" >
         <property name= "targetDataSources" >
             <map key-type= "java.lang.String" >
                 <entry value-ref= "myUserDataSource"  key= "userDataSource" />
                 <entry value-ref= "myItemDataSource"  key= "itemDataSource" />
             </map>
         </property>
         <!-- 默认使用myUserDataSource的数据源,必须要配置,不然会启动报错 -->
           <property name= "defaultTargetDataSource"  ref= "userDataSource" /> 
      </bean>

有童鞋可能会问:DynamicDataSource这个类是怎么回事?

别急,这个类是自定义的一个类,此类必须继承:AbstractRoutingDataSource这个抽象类,并且重写

AbstractRoutingDataSource方法,动态数据源才会生效。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
/**
  * 自定义动态数据源,继承AbstractRoutingDataSource抽象类,
  * 重写determineCurrentLookupKey方法
  * @author root
  */
public  class  DynamicDataSource  extends  AbstractRoutingDataSource {
 
     @Override
     protected  Object determineCurrentLookupKey() {
         return  DataSourceContextHolder.getDbType();
     }
}

问:DataSourceContextHolder这个类是什么干嘛的?

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
*设置数据库类型,指定使用哪个数据库
*@author root
*/
public  class  DataSourceContextHolder {
     
     private  static  final  ThreadLocal<String> contextHolder =  new  ThreadLocal<String>();
     //默认数据源(userDataSource)
     public  static  final  String userDataSource =  "userDataSource" ;
     
     //另外一个数据源(和配置文件中的key对应)
         public  static  final  String itemDataSource =  "itemDataSource" ;
 
     public  static  void  setDbType(String dbType) {
         contextHolder.set(dbType);
     }
 
     public  static  String getDbType() {
         return  ((String) contextHolder.get());
     }
 
     public  static  void  clearDbType() {
         contextHolder.remove();
     }
}

问:那事物怎么管理呢?别急,继续往下看……

配置三:applicationContext-transaction.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- 定义事务管理器 -->
     <bean id= "transactionManager"
         class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
         <property name= "dataSource"  ref= "dynamicDataSource"  />
     </bean>
 
     <!-- 定义事务策略 -->
     <tx:advice id= "txAdvice"  transaction-manager= "transactionManager" >
         <tx:attributes>
             <!--所有以query开头的方法都是只读的 -->
             <tx:method name= "query*"  read-only= "true"  />
             <!--其他方法使用默认事务策略 -->
             <tx:method name= "*"  />
         </tx:attributes>
     </tx:advice>
 
     <aop:config>
         <!--pointcut元素定义一个切入点,execution中的第一个星号 用以匹配方法的返回类型,
             这里星号表明匹配所有返回类型。 com.abc.dao.*.*(..)表明匹配com.simple.mybatis.service包下的所有类的所有 
             方法 -->
         <aop:pointcut id= "myPointcut"  expression= "execution(* com.simple.sso.service.*.*(..))"  />
         <!--将定义好的事务处理策略应用到上述的切入点 -->
         <aop:advisor advice-ref= "txAdvice"  pointcut-ref= "myPointcut"  />
     </aop:config>

问:那么sqlSessionFactory怎么获取数据源呢?继续配置……

配置四:applicationContext-mybatis.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
   <!-- 定义Mybatis的SqlSessionFactory -->
     <bean id= "sqlSessionFactory"  class = "org.mybatis.spring.SqlSessionFactoryBean" >
         <!-- 定义数据源 -->
         <property name= "dataSource"  ref= "dynamicDataSource"  />
         <!-- 指定mybatis全局配置文件 -->
         <property name= "configLocation"  value= "classpath:mybatis/mybatis-config.xml" ></property>
         
         <!-- 扫描mappers目录以及子目录下的所有xml文件 -->
<!--           <property name= "mapperLocations"  value= "classpath:mybatis/mappers/**/*.xml"  /> -->
           
           <!-- 别名扫描包 -->
           <property name= "typeAliasesPackage"  value= "com.simple.sso.pojo" />
     </bean>

到这里,其实该配置的都已经配置完了。

问:那么在代码中该如何使用呢?比如说要插入的数据时该往哪个数据库中插入呢?我怎么保证数据就是我要插入的数据库呢?

就是在代码中手动切换下,在事物开启之前先手动设置指定下数据库,然后进行逻辑,如果是要对配置的默认数据库进行操作的话就不用切数据库了,如果是对另外一个数据库操作的话就要在Controller中手动切换数据库:

1
2
3
4
5
6
7
//手动切换数据库
DataSourceContextHolder.setDbType(DataSourceContextHolder.itemDataSource);
 
// 需要执行的逻辑代码……对数据库的增删改
 
//这里要手动清理刚开启的事物,不然后面的操作可能会出现错误。
DataSourceContextHolder.clearDbType();

这样就欧了。


本文转自 兴趣e族 51CTO博客,原文链接:http://blog.51cto.com/simplelife/1706542


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
53 14
|
1天前
|
Java Spring
【Spring配置】创建yml文件和properties或yml文件没有绿叶
本文主要针对,一个项目中怎么创建yml和properties两种不同文件,进行配置,和启动类没有绿叶标识进行解决。
|
6天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
34 6
|
8天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
53 3
|
1天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
|
1天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
1天前
|
Java Spring
【Spring配置相关】启动类为Current File,如何更改
问题场景:当我们切换类的界面的时候,重新启动的按钮是灰色的,不能使用,并且只有一个Current File 项目,下面介绍两种方法来解决这个问题。
|
25天前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
41 4
|
25天前
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
39 3
|
27天前
|
Java 关系型数据库 数据库连接
使用 Spring Boot 执行数据库操作:全面指南
使用 Spring Boot 执行数据库操作:全面指南
99 1