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>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux驱动】字符设备驱动程序框架 | LED驱动

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3c0;Hello驱动程序⚽驱动程序框架⚽编程 &#x1f3c0;LED驱动⚽配置GPIO⚽编程驱动…

YB75XXH系列是采用CMOS工艺制造,低功耗的高压稳压器

YB75xxH 高耐压线性稳压器 ■产品简介&#xff1a; YB75XXH系列是采用CMOS工艺制造&#xff0c;低功耗的高压稳压器&#xff0c;最高输入电压可达25V,输出电压范围为1.5V一12.0V。它具有高精度的输出电压、极低的供电电流、极低的跌落电压等特点。 ■产品特点&#xff1a; …

SpringBoot 3 集成Hive 3

前提条件: 运行环境&#xff1a;Hadoop 3.* Hive 3.* MySQL 8 &#xff0c;如果还未安装相关环境&#xff0c;请参考&#xff1a;Hive 一文读懂 Centos7 安装Hadoop3 单机版本&#xff08;伪分布式版本&#xff09; SpringBoot 2 集成Hive 3 pom.xml <?xml ver…

如何解决错误代码0xc0000001,这里提供错误原因、解决办法和预防措施

错误代码0xc0000001是Windows中最常见的错误代码之一&#xff0c;可以追溯到Windows XP。如果你看到它&#xff0c;你可能遇到严重的问题&#xff0c;因为你的电脑可能丢失了一段重要的代码或一个重要的组件。以下是错误代码0xc0000001以及如何处理它。​ 错误代码0xc0000001的…

MyBatis 通过 SqlSession 实现动态Entity批量插入

需要几个关键点: 1、entity对应的service需要继承BaseService 2、entity对应的serviceImpl需要实现baseMapper方法&#xff0c;需要把当前的mapper返回去 3、entity对应的Mapper需要BaseMapper

又是阿里,通义灵码免费平替GitHub Copilot

毫无疑问&#xff0c;人工智能已经在影响着我们日常生活的方方面面&#xff0c;同样的在软件开发领域&#xff0c;AI正在改变我们的开发方式。在软件开发领域&#xff0c;尽管有许多强大的AI编码工具&#xff0c;但国产&#xff0c;免费&#xff0c;使用门槛低&#xff0c;用起…

机器学习算法(11)——集成技术(Boosting——梯度提升)

一、说明 在在这篇文章中&#xff0c;我们学习了另一种称为梯度增强的集成技术。这是我在机器学习算法集成技术文章系列中与bagging一起介绍的一种增强技术。我还讨论了随机森林和 AdaBoost 算法。但在这里我们讨论的是梯度提升&#xff0c;在我们深入研究梯度提升之前&#xf…

linux buffer的回写的触发链路

mark_buffer_dirty中除了会标记dirty到buffer_head->state、page.flag、folio->mapping->i_pages外&#xff0c;还会调用inode所在文件系统的dirty方法&#xff08;inode->i_sb->s_op->dirty_inode&#xff09;。然后为inode创建一个它所在memory group的wri…

脱离SpringCloud,怎么使用Feign远程调用接口?Gradle项目教程

一、引入依赖 implementation io.github.openfeign:feign-core:11.0 implementation com.netflix.feign:feign-jackson:8.18.0 二、客户端接口类 MyFeignClient package com.fdw.study.feign;import com.fdw.study.validate.User; import feign.RequestLine; import org.sprin…

(十七)Flask之大型项目目录结构示例【二扣蓝图】

大型项目目录结构&#xff1a; 问题引入&#xff1a; 在上篇文章讲蓝图的时候我给了一个demo项目&#xff0c;其中templates和static都各自只有一个&#xff0c;这就意味着所有app的模板和静态文件都放在了一起&#xff0c;如果项目比较大的话&#xff0c;这就非常乱&#xf…

[node] Node.js的全局对象Global

[node] Node.js的全局对象Global 什么是全局对象 & 全局变量全局对象与全局变量全局变量-- __filename全局变量-- __dirname全局函数-- setTimeout(cb, ms)全局函数-- clearTimeout(t)全局函数-- setInterval(cb, ms)全局变量-- consoleconsole 方法概览 全局变量-- proces…

阿里云吴结生:云计算是企业实现数智化的阶梯

云布道师 近年来&#xff0c;越来越多人意识到&#xff0c;我们正处在一个数据爆炸式增长的时代。IDC 预测 2027 年全球产生的数据量将达到 291 ZB&#xff0c;与 2022 年相比&#xff0c;增长了近 2 倍。其中 75% 的数据来自企业&#xff0c;每一个现代化的企业都是一家数据公…

Http 请求体和响应体中重要的字段

Http 请求体 Accept&#xff1a;用于告诉服务器客户端能够处理哪些媒体类型。Accept 头中的值通常是一个或多个 MIME 类型&#xff0c;并按优先级排序。服务器会根据 Accept 头中的值来决定响应的内容类型。例如&#xff0c;Accept: text/plain, text/html。Content-Type&…

CentOS 8的新特性

CentOS 8在2019年发布&#xff0c;带来了比CentOS 7更多的新特性和改进。以下是一些主要的变化和优化&#xff1a; 软件包更新&#xff1a;CentOS 8提供了更新的软件包和程序&#xff0c;包括但不限于Python 3、MySQL 8、PHP 7.2、Ruby 2.5、PostgreSQL 10等。 应用流&#xf…

大创项目推荐 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

Excel 获取当前行的行数

ROW() 获取当前行 ROW()1 获取当前行然后支持二次开发

【H3C】交换机VLAN配置

交换机配置 ACCESS配置方式 u t m //关闭提示 sys //进入系统视图 vlan 10 to 11 //批量创建vlan10到11 int g1/0/1 //进接口 port link-type access //配置接口类型access&#xff0c;t…

Linux--Shell脚本应用实战

实验环境 随着业务的不断发展&#xff0c;某公司所使用的Linux服务器也越来越多。在系统管理和维护过程中&#xff0c;经 常需要编写一些实用的小脚本&#xff0c;以辅助运维工作&#xff0c;提高工作效率。 需求描述 > 编写一个名为getarp.sh的小脚本&#xff0c;记录局域…

基于OpenCV的视频流处理方法

OpenCV提供了VideoCapture类和VideoWriter类来支持各种格式的视频流&#xff0c;支持的格式类型会因系统的不同而有所变化&#xff0c;但基本上都是支持avi格式的&#xff0c;且对于视频文件和摄像头画面的读写所用到的接口基本上都相同&#xff0c;因此&#xff0c;我们把它们…

大数运算·字符串相加·阶乘

大数&#xff0c;就是C/C中利用基本类型所不能存储的数字&#xff0c;少则数十位&#xff0c;大则几万位&#xff0c;如何存储和计算大数就是本文的内容。 在C和C中&#xff0c;没有存储大数的数据结构&#xff0c;就算 unsigned long long也只能表示19位的数字  如果我们用d…