介绍MyBatis项目中如何配置多个数据源连接数据库,以及设置sql文的二级缓存功能,配置多数据源与数据连接池等功能。为大家开发和平时练习的时候提供参考和查询的工具文章。

代码下载百度网盘下载:https://pan.baidu.com/s/1Q6pbC2SR70HKCeVXgOGUPQ
提取码:1234

本站资源下载

Springboot + MyBatis入门培训 1 项目运行环境配置

Springboot + MyBatis入门培训 2 增改删除与查询 in like foreach操作

MyBatis多数据源设置

在实际的项目开发中通常会遇到业务数据保存在不同的数据库中,而我们需要操作多个数据数据库进行业务操作的情况。在MyBati中是可以同时使用多个数据源连接数据库的,项目中导入dynamic-datasource 插件就可以配置多个数据源的连接,使用起来非常的简单,操作与维护性非常的高。dynamic-datasource可以封装成Spring Starter方式引入,支持Mybatis读写分离,支持通过注解动态切换切换数据源。

pom.xml

<!--多数据源需要-->
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.3.6</version>
</dependency>

spring boot application.yml文配置

​ 配置多数据源唯一技术难度就是配置上,配置正确调用起来非常简单。

数据源在yml文件中的结构

  • datasource: 数据源根节点
  • dynamic: 多数据源配置头节点
  • primary : 默认主数据名称
  • datasource: 数据节点
  • master:默认节点
  • 子节点: 自定义节点名称

配置层级

spring:                   spring顶层标记datasource:              1级dynamic:              2级primary: master     3级strict: false       3级datasource:         3级master:           4级子节点名称:         4级

找到目录中的application.yml 配置文件,添加如下内容到application.yml 文件中。

  • 数据源配置要在spring节点下建立
  • 默认节点与子数据库节点下配置数据库连接内容

配置2个数据源,在项目工程中可以使用MyBatis访问这两数据库来进行sql文操作。

spring:datasource:dynamic:primary: masterstrict: falsedatasource:master:url: jdbc:mysql://localhost:3306/db1   #数据库一username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverzht:url: jdbc:mysql://localhost:3306/db2  #数据库二username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver

支持在项目中同时配置不同数据库的数据连接

  • oracle 数据库
  • mysql数据库
  • postgresql数据库
  • sqlserver数据库
  • h2数据库

多数据库配置

spring:datasource:dynamic:primary: masterstrict: falsedatasource:master:url: jdbc:mysql://localhost:3306/db1      #mysqlusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverzht:url: jdbc:oracle:thin:@localhost:1521:orcl  #oracleusername: rootpassword: 123456driver-class-name: oracle.jdbc.driver.OracleDriver

同时配置两个不同的数据库连接源。

切换数据源 @Mapper 容器操作

在文件目录中找到 UserSql.xml文件,定义两数据库连接的 sql文方法。

  • UserList 方法的中的use表在数据库localhost:3306/db1 中
  • towlist 方法中的userdb2表在数据库localhost:3306/db2 中

UserSql.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.core.my.app.dao.UserDao"> <select id="UserList" resultType="map">select * from user</select>    <select id="towlist" resultType="map">select * from userdb2</select>
</mapper>

@DS 注解打在要执行的MyBatis 执行方法上。@DS 标注要执行的数据库连接的名称,方法在执行的时候就执行标注的数据库连接。

如果MyBatis 执行方法上没有标注@DS,方法执行默认的数据库连接。

UserDao接口

@Mapper
public interface UserDao {//没有定义@DS 表示执行默认数据库List<Map> UserList(Map map);//强制方法访问数据库localhost:3306/db2来执行@DS("zht")List<Map> towlist(Map map);
}

MyBatisTest测试类

@RunWith(SpringRunner.class)
@SpringBootTest(classes=OnApp.class)
public class MyBatisTest {@Testpublic void TestAddDB(){//第一个数据库连接表测试  user表userdao.UserList(new HashMap());//第二个数据库连接表测试 userdb2表userdao.towlist(new HashMap());}
}

在测试类中定义对应的测试方法。

运行结果

-----------主数据库user表  -----------------
==>  Preparing: select * from user WHERE id in (?) and user like '%%'
==> Parameters: null
<==      Total: 0
-----------子数据库sys_user表-----------------
==>  Preparing: select * from sys_user
==> Parameters:
<==  Columns: id, acc, paw, u_name, u_post, u_edu, birthday, notes, deptid, isamdin

不同数据库操作同表 @Service容器操作

如果两个数据库中有同一张表,在UserSql.xml中定义同一张表的sql文业务操作,我们要怎么做呢?我们需要定义一个spring @Service容器,在容器中使用**@DS** 注解来区分不同数据库的操作。

UserSql.xml

<select id="addlist" resultType="map">select * from user
</select>

在数据库一和数据库二中同时创建一个表user,在UserSql.xml中定义个 select * from user 业务的sql文方法。

UserDao接口

@Mapper
public interface UserDao {//所有数据库共同使用一张表List<Map> addlist(Map map);
}

UserDao接口中定义这个表查询的MyBatis 执行方法

UserServer 业务类

在@Service容器类中定义两个执行方法,一个没有**@DS** 注解的方法执行查询默认数据库中user表,别一个定义@DS(“zht”)查询数据库二中的user表信息。

@Service
public class UserServer {@AutowiredUserDao user;public List getOne(Map map){return user.addlist(map);}@DS("zht")public List getTow(Map map){return user.addlist(map);}
}

MyBatisTest测试类

@RunWith(SpringRunner.class)
@SpringBootTest(classes=OnApp.class)
public class MyBatisTest {@AutowiredUserServer us;//业务容器引入@Testpublic void AddDB(){//第一个数据库连接user表us.getOne(new HashMap());//第二个数据库连接user表us.getTow(new HashMap());}
}

运行结果

-----------主数据库查询  -----------------
==>  Preparing: select * from user
==> Parameters:
<==    Columns: id, user
<==        Row: 1, username
<==        Row: 2, zht
<==      Total: 2
-----------子数据库查询  -----------------
==>  Preparing: select * from user
==> Parameters:
<==    Columns: id, name
<==        Row: 1, 数据库2
<==      Total: 1

MyBatis缓存 ehcache设置

MyBatis为了提高数据库的使用效率,我们通常会使用到二级缓存,通过二级缓存来操作常用的业务数来达到减轻数据库压力提高效率。java中现在有大量的缓存框架,我们选择ehcache是应为它非常的成熟,和MyBatis结合的度是最好的,最最最重要的是它操作特别简单,基本可以一看就会很容易上手,实际项目使用起来非常方便。

pom.xml

  <dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.2.1</version></dependency>

在需要使用缓存的 MyBatis业务sql.xml 中写入 ehcache 缓存配置xml元素。缓存分为两种,1普通缓存EhcacheCache,2阻塞缓存 EhBlockingCache。

  • org.mybatis.caches.ehcache.EhcacheCache 普通缓存

  • org.mybatis.caches.ehcache.EhBlockingCache 阻塞缓存

UserSql.xml加入缓存

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.core.my.app.dao.UserDao"><cache type="org.mybatis.caches.ehcache.EhcacheCache"/><select id="addlist" resultType="map">select * from user</select>
</mapper>

MyBatis业务sql.xml 中默认设置, 这样就可以简单的声明缓存了。

缓存应用于每个语句

  • 一旦在 xml 中声明了缓存,缓存将应用于 xml 中的所有sql语句。
  • 如果不想使用缓存,在语句上添加 useCache=“false” 作为元素属性。
<!-- 如果不想使用缓存,简单的设置一下 useCache="false" -->
<select id="addlist" resultType="map" useCache="false">select * from user</select>
<!-- 不设置useCache="false" 操作的数据信息将保持在缓存中 -->
<insert id="saveuser">
INSERT INTO user(id, user)VALUES(#{id}, #{name})
</insert>

ehcache 缓存池大小设置

<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.core.my.app.dao.UserDao"><cache type="org.mybatis.caches.ehcache.EhcacheCache"><property name="timeToIdleSeconds" value="3600"/><property name="timeToLiveSeconds" value="3600"/><property name="maxEntriesLocalHeap" value="10000"/><property name="maxEntriesLocalDisk" value="10000000"/><property name="memoryStoreEvictionPolicy" value="LRU"/></cache>

一般在中小型项目中以上的缓存池配置基本可以满足业务需求,在常用的业务 sql.xml中加入以下配置就可以了。

参数列表

名称 内容
timeToIdleSeconds 设定允许对象处于空闲状态的最长时间
timeToLiveSeconds 设定对象允许存在于缓存中的最长时间
maxEntriesLocalHeap 缓存可以在本地堆内存中使用的最大缓存条目
maxEntriesLocalDisk 独立缓存可以在本地磁盘上使用的最大缓存条目
memoryStoreEvictionPolicy 当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)

数据连接池设置

我们使用阿里的druid作为数据连接池,阿里的东西不用说做的真的很强,易用性非常的好,而且功能强大我用过那么多的数据池,它的综合性价比是最高的,而且上手成本非常的低,只要yml文件配对了数据池就可用,它的学习和维护成本就在怎么配置yml中的对应参数。

pom.xml

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.1</version>
</dependency>

数据池 application.yml 中的层级

  • 全局数据池设置,与datasource下的dynamic元素同级为全局数据池
  • 独立的数据库连接池设置,在多数据源的数据库连接下面设置自己独立的数据连接池,这个池只能这个个对应的数据自己使用

全局池层级关系

spring:datasource:dynamic:type: com.alibaba.druid.pool.DruidDataSourcedruid://与dynamic同级别 表示是全局数据池所有数据源使用

独立池层级关系

spring:datasource:dynamic:primary: masterstrict: falsedatasource:主数据库:type: com.alibaba.druid.pool.DruidDataSourcedruid://单独的数据连接池设置子数据库:type: com.alibaba.druid.pool.DruidDataSourcedruid://单独的数据连接池设置

数据池 application.yml 中的设置

全局池例子

server:port: 8888
spring:datasource:dynamic:primary: masterstrict: falsedatasource:master:url: jdbc:mysql://localhost:3306/systext?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver zht:url: jdbc:mysql://localhost:3306/zhtsys?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 10max-active: 100min-idle: 10max-wait: 60000pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000
mybatis:mapperLocations: classpath*:/mapper/*.xmlconfiguration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  • type 元素表示连接的数据池驱动,如果是其他池下面的标签就换成对应池的元素标签

个数据库的独立池例子

server:port: 8888
spring:datasource:dynamic:primary: masterstrict: falsedatasource:master:url: jdbc:mysql://localhost:3306/systext?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 10max-active: 100min-idle: 10max-wait: 60000pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000  zht:url: jdbc:mysql://localhost:3306/zhtsys?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 10max-active: 100min-idle: 10max-wait: 60000pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000
mybatis:mapperLocations: classpath*:/mapper/*.xmlconfiguration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

druid 配置参数

属性 说明 备注
initialSize 启动程序时,在连接池中初始化多少个连接 100
maxActive 连接池中最多支持多少个活动会话
maxWait 程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池没有可用连接,单位毫秒,设置-1时表示无限等待 100
minEvictableIdleTimeMillis 池中某个连接的空闲时长达到 N 毫秒后, 连接池在下次检查空闲连接时,将回收该连接,要小于防火墙超时设置net.netfilter.nf_conntrack_tcp_timeout_established的设置
timeBetweenEvictionRunsMillis 检查空闲连接的频率,单位毫秒, 非正整数时表示不进行检查
keepAlive 程序没有close连接且空闲时长超过 minEvictableIdleTimeMillis,则会执行validationQuery指定的SQL,以保证该程序连接不会池kill掉,其范围不超过minIdle指定的连接个数。 true
minIdle 回收空闲连接时,将保证至少有minIdle个连接. 与initialSize相同
removeAbandoned 要求程序从池中get到连接后, N 秒后必须close,否则druid 会强制回收该连接,不管该连接中是活动还是空闲, 以防止进程不会进行close而霸占连接。 当发现程序有未正常close连接时设置为true
removeAbandonedTimeout 设置druid 强制回收连接的时限,当程序从池中get到连接开始算起,超过此值后,druid将强制回收该连接,单位秒。 应大于业务运行最长时间
logAbandoned 当druid强制回收连接后,是否将stack trace 记录到日志中 true
testWhileIdle 当程序请求连接,池在分配连接时,是否先检查该连接是否有效。(高效) true
validationQuery 检查池中的连接是否仍可用的 SQL 语句,drui会连接到数据库执行该SQL, 如果
testOnBorrow 程序 申请 连接时,进行连接有效性检查(低效,影响性能) false
testOnReturn 程序 返还 连接时,进行连接有效性检查(低效,影响性能) false
poolPreparedStatements 缓存通过以下两个方法发起的SQL
maxPoolPrepareStatementPerConnectionSize 每个连接最多缓存多少个SQL 20
connectProperties 连接属性。比如设置一些连接池统计方面的配置。

druid 是个功能很强大的数据池,提供很多其他功能如果有需要加入其他功能的可以参考一下,下面中的配置内容。

server:port: 8888
spring:datasource:dynamic:primary: masterstrict: falsedatasource:master:url: jdbc:mysql://localhost:3306/systext?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver zht:url: jdbc:mysql://localhost:3306/zhtsys?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSourcedruid:# 连接池的配置信息# 初始化大小,最小,最大initial-size: 5min-idle: 5maxActive: 20# 配置获取连接等待超时的时间maxWait: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1testWhileIdle: truetestOnBorrow: falsetestOnReturn: false# 打开PSCache,并且指定每个连接上PSCache的大小poolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙filters: stat,wall,slf4j# 通过connectProperties属性来打开mergeSql功能;慢SQL记录connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000# 配置DruidStatFilterweb-stat-filter:url-pattern: "/*"exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"# 配置DruidStatViewServletstat-view-servlet:enabled: trueurl-pattern: "/druid/*"# IP白名单(没有配置或者为空,则允许所有访问)allow: 127.0.0.1,192.168.3.25# IP黑名单 (存在共同时,deny优先于allow)#        deny: localhost#  禁用HTML页面上的“Reset All”功能reset-enable: false# 登录名login-username: admin# 登录密码login-password: 123456
mybatis:mapperLocations: classpath*:/mapper/*.xmlconfiguration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

【Springboot 入门培训】#3 MyBatis 多数据源与缓存和数据连接池设置相关推荐

  1. 【Springboot 入门培训 】#18 SpringBoot Cache 缓存实现

    目录 1 EhCache3 1 执行环境设置 2 Ehcache3 应用 3 Ehcache3 xml设置 2 Caffeine 3 Infinispan 1 SpringBoot嵌入式缓存 2 Ja ...

  2. 【Springboot 入门培训】# 17 WebJars + BootStrap5 常用JS组件应用

    在传统的前后一体项目开发中,大部分人会使用到BootStrap加其它JS组件的配合方式来完成页面UI功能的实现.下面介绍几种常用的JS库的使用方法.代码例子下载 目录 1 树形组件 1.1 TreeJ ...

  3. 【Springboot 入门培训】#7 (Framework7 移动webapp) 页面路由跳转

    ​ 学习使用routes 路由来进行页面访问,如何定义路由类routes属性与方法引用.掌握routes 路由类的使用就掌握了Framework7 页面之间的访问控制,才能真正的发挥Framework ...

  4. SpringBoot中数据连接池的配置(tomcat,HikariCP,dbcp2,druid)

    SpringBoot中数据连接池的配置(tomcat,HikariCP,dbcp2,druid) 文章目录 SpringBoot中数据连接池的配置(tomcat,HikariCP,dbcp2,drui ...

  5. JDBC、DriverManage、JNDI、数据源(DataSource)、连接池的区别

    JDBC.DriverManage.JNDI.数据源(DataSource).连接池的区别 使用 JDBC 来访问数据库的基本流程 JDBC 与 DriverManage 数据源 JNDI 连接池 使 ...

  6. Netbeans 中创建数据连接池和数据源步骤(及解决无法ping通问题)

    1.启动glassfish服务器, 在浏览器的地址栏中输入 http://localhost:4848 2.首先建立JDBC Connection Pools: 3.new 一个Connectio P ...

  7. JDBC、数据源、数据连接池的介绍和区别(三个是不同的东西,别再搞混了)

    1.JDBC的介绍   为了使Java编写的程序不依赖于具体的数据库,Java提供了用于专门操作数据库的API,即JDBC(Java Data Base Connectivity).JDBC操作不同数 ...

  8. SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

    我们这一一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池的好处我 ...

  9. springboot集成alibaba-druid数据连接池及配置

    一.pom文件中引入依赖 <!--引入druid数据源--><dependency><groupId>com.alibaba</groupId>< ...

最新文章

  1. java显示当月数据_Java统计当月与往月数据 使用StringTemplate
  2. 第十二课:小信号分析 (二)
  3. 关于webpack的使用
  4. Grafana关键表结构分析
  5. HTML5 之 新特性 + 新对象
  6. 在Oracle Linux 7上通过官方Repo在线安装SQL Server 2017
  7. bitcount java_Java源码解释之Integer.bitCount
  8. 蛋糕连锁店网站管理系统v1.5.1-企业建站系统源码
  9. linux文件定时备份到windows,Linux和windows定时备份数据到百度云盘
  10. 笔记:vue项目中引用百度地图,地图空白现象
  11. 将SpringBoot项目打包并部署到云端 -- jar、war、tomcat
  12. 虚拟服务器声卡,什么是虚拟声卡?虚拟声卡可以当声卡使用吗?
  13. 【雷达通信】基于matlab CDIF算法雷达信号分选【含Matlab源码 1186期】
  14. matlab产生年月日的时间序列,求助:在MATLAB里如何输入时间序列中的时间
  15. lnmp一键安装远程连接mysql_阿里云 lnmp一键安装包远程访问Mysql
  16. 腾讯IM请求报错腾讯IM:70421参数类型有问题
  17. 如何用html语言制作圆角矩形,webGL中圆角矩形的绘制
  18. 蚂蚁金服CTO程立:创新发展数字时代金融关键技术
  19. Android开发艺术探索 第一章 Activity的生命周期和启动模式
  20. 云计算 常见问题案例汇总情况

热门文章

  1. spark官方配置参数详解
  2. 跨域解决方式——JSONP,CORS
  3. c语言判断字符是否为回车,c语言EFO。。。是怎么判断的。。读到回车结束还是什么...
  4. elasticsearch 安装的坑
  5. linux赛门铁克扫描,赛门铁克数据扫描程序(Symantec Data Scanner, SDS)技术简介
  6. C语言干货分享|更高层次编写嵌入式C代码
  7. AutoJs学习-录屏功能
  8. 批训练、注意力模型及其声纹分割应用,谷歌三篇论文揭示其声纹识别技术原理
  9. 视频剪辑,轻松将多个视频顺时针旋转90度
  10. 详解servlet生命周期