Mybatis配置-环境配置(environments)
MyBatis支持配置多个环境,这有助于将您的SQL映射应用于多个数据库,无论出于何种原因。例如,您可能希望为开发、测试和生产环境使用不同的配置。或者,您可能有多个共享相同模式的生产数据库,并且想要在两者上使用相同的SQL映射。有许多使用情况可以考虑。
有一件重要的事需要记住:虽然您可以配置多个环境,但在每个SqlSessionFactory实例中只能选择一个环境。
因此,如果您想要连接到两个数据库,您需要创建两个SqlSessionFactory实例,每个实例连接一个数据库。对于三个数据库,您需要三个实例,依此类推。这是非常容易记住的。
- 每个数据库使用一个SqlSessionFactory实例。
要指定要构建的环境,只需将其作为可选参数传递给SqlSessionFactoryBuilder。接受环境参数的两种签名是:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
如果省略了环境参数,则会加载默认环境,如下所示:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
environments元素定义了环境的配置。
<environments default="development"><environment id="development"><transactionManager type="JDBC"><property name="..." value="..."/></transactionManager><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment>
</environments>
请注意以下关键部分:
- 默认环境ID(例如 default="development")。
- 每个定义环境的环境ID(例如 id="development")。
- 事务管理器的配置(例如 type="JDBC")。
- 数据源的配置(例如 type="POOLED")。
默认环境和环境ID可以根据您的喜好进行命名,只要确保默认环境与其中一个环境ID匹配即可。
transactionManager
MyBatis包含两种事务管理器类型(即type="[JDBC|MANAGED]"),它们分别是:
- JDBC – 这个配置直接使用JDBC的提交和回滚功能。它依赖于从数据源(dataSource)获取的连接来管理事务的范围。默认情况下,它在关闭连接时启用自动提交,以保证与一些驱动程序的兼容性。然而,对于某些驱动程序来说,启用自动提交不仅是不必要的,而且还是一个昂贵的操作。因此,从版本3.5.10开始,您可以通过将“skipSetAutoCommitOnClose”属性设置为true来跳过这一步骤。例如:
<transactionManager type="JDBC"><property name="skipSetAutoCommitOnClose" value="true"/>
</transactionManager>
- MANAGED – 这个配置实际上几乎不做任何操作。它不会提交或回滚连接。相反,它让容器来管理事务的整个生命周期(例如JEE应用服务器的上下文)。默认情况下,它会关闭连接。然而,某些容器不希望出现这种情况,因此如果您需要阻止它关闭连接,请将“closeConnection”属性设置为false。例如:
<transactionManager type="MANAGED"><property name="closeConnection" value="false"/>
</transactionManager>
注意:如果您计划将MyBatis与Spring一起使用,就不需要配置任何事务管理器,因为Spring模块会设置自己的事务管理器,覆盖任何先前设置的配置。
这两种事务管理器类型都不需要任何属性。然而,它们都是类型别名,换句话说,您可以使用自己的完全限定类名或类型别名来引用您自己实现的TransactionFactory接口。
public interface TransactionFactory {default void setProperties(Properties props) { // Since 3.5.2, change to default method// NOP}Transaction newTransaction(Connection conn);Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);
}
在XML中配置的任何属性都将在实例化后传递给setProperties()方法。您的实现还需要创建一个Transaction实现,它也是一个非常简单的接口:
public interface Transaction {Connection getConnection() throws SQLException;void commit() throws SQLException;void rollback() throws SQLException;void close() throws SQLException;Integer getTimeout() throws SQLException;
}
使用这两个接口,您可以完全自定义MyBatis如何处理事务。
dataSource
dataSource元素使用标准的JDBC DataSource接口配置JDBC连接对象的来源。
大多数MyBatis应用程序将按示例配置一个dataSource。但是,这并不是必需的。需要注意的是,为了方便延迟加载(Lazy Loading),这个dataSource是必需的。
有三种内置的数据源类型(type="[UNPOOLED|POOLED|JNDI]"):
UNPOOLED - 这个数据源的实现在每次请求时都会打开和关闭一个连接。虽然速度稍慢,但对于不需要立即可用连接性能的简单应用程序来说,这是一个不错的选择。不同的数据库在这个性能方面也有所不同,所以对于某些数据库来说,池化连接可能不太重要,这种配置会更理想。UNPOOLED数据源有以下属性可以配置:
- driver - 这是JDBC驱动程序的完全限定Java类名(如果您的驱动程序包含一个DataSource类,则不是它)。
- url - 这是您数据库实例的JDBC URL。
- username - 用于登录的数据库用户名。
- password - 用于登录的数据库密码。
- defaultTransactionIsolationLevel - 连接的默认事务隔离级别。可以使用以下预定义常量来设置:NONE, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE。
- defaultNetworkTimeout - 默认的网络超时值,以毫秒为单位,用于等待数据库操作完成。有关详细信息,请参阅java.sql.Connection#setNetworkTimeout()的API文档。
可选地,您还可以向数据库驱动程序传递属性。要做到这一点,将属性前缀为 driver.
,例如:
driver.encoding=UTF8
这将通过DriverManager.getConnection(url, driverProperties)方法向您的数据库驱动程序传递属性编码,属性名称为encoding,值为UTF8。
POOLED - 这是一种DataSource的实现,它可以池化JDBC连接对象,以避免创建新的连接实例所需的初始连接和身份验证时间。这是并发Web应用程序实现最快响应的常用方法。
除了上述的(UNPOOLED)属性之外,还有许多其他属性可用于配置POOLED数据源。以下是一些常用的属性:
- 属性
poolMaximumActiveConnections
表示同时存在的活动(即正在使用)连接的数量。默认值为10。 - 属性
poolMaximumIdleConnections
表示同时存在的空闲连接的数量。 - 属性
poolMaximumCheckoutTime
表示一个连接在被"check out"(即被获取)之后可以持续存在的最长时间,超过此时间将被强制返回到连接池。默认值为20000毫秒(即20秒)。 - 属性
poolTimeToWait
是一个低级设置,用于在获取连接花费异常长的时间时,给连接池一个机会打印日志状态并重新尝试获取连接(以避免在连接池配置错误的情况下永远静默失败)。默认值为20000毫秒(即20秒)。 - 属性
poolMaximumLocalBadConnectionTolerance
是关于线程容忍的坏连接数量的低级设置。如果一个线程获取到一个坏连接,它可能还有另外一次机会重新尝试获取到另一个有效的连接。但重试次数不应超过poolMaximumIdleConnections和poolMaximumLocalBadConnectionTolerance之和。默认值为3(自3.4.5起)。 - 属性
poolPingQuery
是发送给数据库的Ping查询,用于验证连接是否工作正常,并准备接受请求。默认值为"NO PING QUERY SET",这会导致大多数数据库驱动程序以良好的错误消息失败。 - 属性
poolPingEnabled
用于启用或禁用ping查询。如果启用,还必须设置具有有效SQL语句的poolPingQuery属性(最好是一个非常快的查询)。默认值为false。 - 属性
poolPingConnectionsNotUsedFor
配置poolPingQuery的使用频率。可以将其设置为与数据库连接的典型超时时间相匹配,以避免不必要的ping查询。默认值为0(即每次都对所有连接进行ping查询,但前提是poolPingEnabled为true)。
JNDI(Java命名和目录接口)的这种DataSource实现是为与EJB或应用服务器等容器一起使用而设计的。这些容器可以集中或外部地配置DataSource,并将对它的引用放置在JNDI上下文中。这种DataSource配置只需要两个属性:
- initial_context – 这个属性用于从InitialContext中查找上下文(即initialContext.lookup(initial_context))。这个属性是可选的,如果省略,则会直接在InitialContext中查找data_source属性。
- data_source – 这是一个上下文路径,用于找到对DataSource实例的引用。它会根据initial_context查找返回的上下文进行查找,或者如果没有提供initial_context,则会在InitialContext中直接进行查找。
与其他DataSource配置类似,可以通过在属性前加上"env."的方式将属性直接发送给InitialContext。例如:
env.encoding=UTF8
这将会在实例化InitialContext的构造函数中将属性"encoding"和值"UTF8"发送给InitialContext。
通过实现接口org.apache.ibatis.datasource.DataSourceFactory,您可以插入任何第三方的DataSource:
public interface DataSourceFactory {void setProperties(Properties props);DataSource getDataSource();
}
org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory可以作为构建新的数据源适配器的超类使用。例如,下面是将C3P0插入的代码示例:
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;
import com.mchange.v2.c3p0.ComboPooledDataSource;public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {public C3P0DataSourceFactory() {this.dataSource = new ComboPooledDataSource();}
}
要设置它,为您希望MyBatis调用的每个setter方法添加一个属性。下面是一个连接到PostgreSQL数据库的示例配置:
<dataSource type="org.myproject.C3P0DataSourceFactory"><property name="driver" value="org.postgresql.Driver"/><property name="url" value="jdbc:postgresql:mydb"/><property name="username" value="postgres"/><property name="password" value="root"/>
</dataSource>
相关文章:
Mybatis配置-环境配置(environments)
MyBatis支持配置多个环境,这有助于将您的SQL映射应用于多个数据库,无论出于何种原因。例如,您可能希望为开发、测试和生产环境使用不同的配置。或者,您可能有多个共享相同模式的生产数据库,并且想要在两者上使用相同的…...

Android模拟器的安装和adb连接
一、前置说明 APP 自动化可以使用真机进行测试,也可以使用模拟器来模拟安卓设备。我们可以根据个人喜好安装模拟器,个人推荐安装两款模拟器:网易 MuMu 模拟器、夜神模拟器。 MuMu模拟器可以支持 Android 12 版本,优点是…...
引领创新潮流,武汉灰京文化开创游戏行业新推广标杆
作为市场引领者,武汉灰京文化通过多渠道、多维度的市场推广手段,不仅助力游戏产品广泛传播,更为整个游戏行业树立了新的推广标杆。公司的成功经验为其他游戏发行商提供了有力的借鉴,推动了行业向更创新、更多元的方向发展。 引领…...

HTML5文档
目录 HTML5文档结构1.HTML5页面结构2.HTML5新增结构元素 HTML5新增页面元素1.hgroup标记2.figure标记与figcaption标记3.mark标记与time标记4.details标记与summary标记5.progress标记与meter标记6.input标记与datalist标记 HTML5文档结构 HTML5文档结构同样是由头部和主体两部…...

springboot实现发送邮件开箱即用
springboot实现发送邮件开箱即用 环境依赖包yml配置Service层Controller层测试 环境 jdk17 springboot版本3.2.1 依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><ver…...

论文阅读——RS DINO
RS DINO: A Novel Panoptic Segmentation Algorithm for High Resolution Remote Sensing Images 基于MASKDINO模型,加了两个模块: BAM:Batch Attention Module 遥感图像切分的时候把一个建筑物整体比如飞机场切分到不同图片中,…...

【即插即用篇】YOLOv8改进实战 | 引入 Involution(内卷),用于视觉识别的新一代神经网络!涨点神器!
YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8是一种尖端的、最先进的 (SOTA) 模型,它建立在以前成…...

在Excel中,如何简单快速地删除重复项,这里提供详细步骤
当你在Microsoft Excel中使用电子表格时,意外地复制了行,或者如果你正在制作其他几个电子表格的合成电子表格,你将遇到需要删除的重复行。这可能是一项非常无脑、重复、耗时的任务,但有几个技巧可以让它变得更简单。 删除重复项 …...
【Kafka-Eagle】EFAK告警配置与实践
Kafka-Eagle是一个开源的Kafka集群监控与告警系统,可以帮助用户实现对Kafka集群的实时监控、性能指标收集以及异常告警等功能。下面是关于Kafka-Eagle的告警配置和实践的一般步骤: 安装和配置Kafka-Eagle: 下载最新版本的Kafka-Eagle安装包&a…...

机器学习 | 概率图模型
见微知著,睹始知终。 见到细微的苗头就能预知事物的发展方向,能透过微小的现象看到事物的本质,推断结论或者结果。 概率模型为机器学习打开了一扇新的大门,将学习的任务转变为计算变量的概率分布。 实际情况中,各个变量…...

25、新加坡南洋理工、新加坡国立大学提出FBCNet:完美融合FBCSP的CNN,EEG解码SOTA水准![抱歉老师,我太想进步了!]
前言: 阴阳差错,因工作需要,需要查阅有关如何将FBCSP融入CNN中的文献,查阅全网,发现只此一篇文章,心中大喜,心想作者哪家单位,读之,原来是自己大导(新加坡工…...

单调栈分类、封装和总结
作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 通过枚举最小(最大)值不重复、不遗漏枚举所有子数组 C算法:美丽塔O(n)解法单调栈左右寻找第一个小于maxHeight[i]的left,right,[left,right]直接的高度都是maxHeight[i] 可以…...

【Amazon 实验①】使用 Amazon CloudFront加速Web内容分发
文章目录 实验架构图1. 准备实验环境2. 创建CloudFront分配、配置动、静态资源分发2.1 创建CloudFront分配,添加S3作为静态资源源站2.2 为CloudFront分配添加动态源站 在本实验——使用CloudFront进行全站加速中,将了解与学习Amazon CloudFront服务&…...
<math.h> 头文件:C语言数学库函数
文章目录 概述基本算术运算sqrt()fabs()pow() 三角函数sin()cos() 对数函数log()log10() 指数函数exp() 其他函数ceil()floor() 结语 概述 math.h 是C语言标准库中的头文件,提供了许多与数学运算相关的函数。在本文中,我们将深入讨论一些 math.h 中常用…...

1.CentOS7网络配置
CentOS7网络配置 查看网络配置信息 ip addr 或者 ifconfig 修改网卡配置信息 vim /etc/sysconfig/network-scripts/ifcfg-ens192 设备类型:TYPEEthernet地址分配模式:BOOTPROTOstatic网卡名称:NAMEens192是否启动:ONBOOTye…...

Prompt-to-Prompt:基于 cross-attention 控制的图像编辑技术
Hertz A, Mokady R, Tenenbaum J, et al. Prompt-to-prompt image editing with cross attention control[J]. arXiv preprint arXiv:2208.01626, 2022. Prompt-to-Prompt 是 Google 提出的一种全新的图像编辑方法,不同于任何传统方法需要用户指定编辑区域ÿ…...

搭载紫光展锐芯的移远通信RedCap模组顺利通过中国联通OPENLAB实验室认证
近日,移远通信联合紫光展锐在中国联通5G物联网OPENLAB开放实验室,完成了RedCap模组RG207U-CN端到端测试验收,并获颁认证证书。移远通信RG207U-CN成为业内率先通过联通OPENLAB认证的紫光展锐RedCap芯片平台的模组。 本次测试基于联通OPENLAB实…...

16-高并发-队列术
队列,在数据结构中是一种线性表,从一端插入数据,然后从另一端删除数据。 在我们的系统中,不是所有的处理都必须实时处理,不是所有的请求都必须实时反馈结果给用户,不是所有的请求都必须100%一次性处理成功…...

【设计模式-2.5】创建型——建造者模式
说明:本文介绍设计模式中,创建型设计模式中的最后一个,建造者模式; 入学报道 创建型模式,关注于对象的创建,建造者模式也不例外。假设现在有一个场景,高校开学,学生、教师、职工都…...

VideoPoet: Google的一种用于零样本视频生成的大型语言模型
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...