Mybatis配置之environments配置元素详解

更新时间:2023-05-12 02:17:04 阅读: 评论:0

Mybatis配置之environments配置元素详解
⽬录
我们先来看⼀下配置
还是从解析的⼊⼝开始看起
进⼊⽅法内部
isSpecifiedEnvironment⽅法如下所⽰
这两种事务管理器的区别
下⾯分别对这三种类型做⼀个简单的说明
(1)UNPOOLED
(2)POOLED
(3)JNDI
在这篇⽂章中,我们接着前⽂继续往下看其他的配置元素,今天的主⾓就是我们的<environments>元素,该元素⽤于对我们需要访问的数据库配置进⾏设置,
我们先来看⼀下配置
<environments default="development">
<environment id="development">
<!-- 使⽤jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="urname" value="${urname}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
从上⾯看,我们知道<environments>下⾯可以配置多个<environment>元素节点,⽽每个<environment>节点我们可以配置两个东西,⼀个是事务管理器配置<transactionManager>,另⼀个是数据源配置<dataSource>。
我们先从源码开始看起,看看这块是怎么解析的,然后再具体看⾥⾯都要配置什么哪些参数。
还是从解析的⼊⼝开始看起
进⼊⽅法内部
从代码看,就是⾸先获取<environments>标签元素的default属性,这个属性作⽤就是指定当前情况下使⽤哪个数据库配置,也就是使⽤哪个<environment>节点的配置,default的值就是配置的<environment>标签元素的id值。
正如上⾯代码中isSpecifiedEnvironment(id)⽅法⼀样,在遍历所有<environment>的时候⼀次判断相
应的id是否是default设置的值,如果是,则使⽤当前<environment>元素进⾏数据库连接的初始化。
isSpecifiedEnvironment⽅法如下所⽰
紧接着,下⾯的代码就是⽤设置的事务管理器和数据源构造相应的对象了。
TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));
DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource"));
DataSource dataSource = DataSource();
Environment.Builder environmentBuilder = new Environment.Builder(id)
.
transactionFactory(txFactory)
.dataSource(dataSource);
configuration.tEnvironment(environmentBuilder.build());
我们⾸先从事务管理器的解析开始,进⼊到transactionManagerElement()⽅法内:
private TransactionFactory transactionManagerElement(XNode context) throws Exception {
if (context != null) {
String type = StringAttribute("type");
Properties props = ChildrenAsProperties();
TransactionFactory factory = (TransactionFactory) resolveClass(type).newInstance();
factory.tProperties(props);
return factory;
}
throw new BuilderException("Environment declaration requires a TransactionFactory.");
}
我们可以看到,这⾥其实是根据<transactionManager>这个元素的type属性来找相应的事务管理器的。
在Mybatis⾥⾯⽀持两种配置:JDBC和MANAGED。这⾥根据type的设置值来返回相应的事务管理器。我们看下,在Mybatis的Configuration类中,已经将这两种配置及对应的事务管理器做了某种关联,如下所⽰:
public Configuration() {
languageRegistry.tDefaultDriverClass(XMLLanguageDriver.class);
}
这两种事务管理器的区别
JDBC:这个配置就是直接使⽤了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作⽤域。
MANAGED:这个配置⼏乎没做什么。它从来不提交或回滚⼀个连接,⽽是让容器来管理事务的整个⽣命周期(⽐如 JEE 应⽤服务器的上下⽂)。默认情况下它会关闭连接,然⽽⼀些容器并不希望这样,因此需要将 cloConnection 属性设置为 fal 来阻⽌它默认的关闭⾏为。
例如:
<transactionManager type="MANAGED">
<property name="cloConnection" value="fal"/>
</transactionManager>
备注:如果你正在使⽤ Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使⽤⾃带的管理器来覆盖前⾯的配置。
说完了事务管理器,紧接着,我们来看看数据源配置。
dataSource 元素使⽤标准的 JDBC 数据源接⼝来配置 JDBC 连接对象的资源。Mybatis⽀持三种内建的数据源类型,分别是UNPOOLED、POOLED和JNDI,即我们在配置<dataSource>元素的type属性时,我们可以直接⽀持设置这三个值。
下⾯分别对这三种类型做⼀个简单的说明
(1)UNPOOLED
这个数据源的实现只是每次被请求时打开和关闭连接。虽然⼀点慢,它对在及时可⽤连接⽅⾯没有性能要求的简单应⽤程序是⼀个很好的选择。
不同的数据库在这⽅⾯表现也是不⼀样的,所以对某些数据库来说使⽤连接池并不重要,这个配置也是理想的。
UNPOOLED 类型的数据源仅仅需要配置以下 5 种属性:
driver:这是 JDBC 驱动的 Java 类的完全限定名(并不是JDBC驱动中可能包含的数据源类)。
url:这是数据库的 JDBC URL 地址。
urname:登录数据库的⽤户名。
password:登录数据库的密码。
defaultTransactionIsolationLevel:默认的连接事务隔离级别。
作为可选项,你也可以传递属性给数据库驱动。要这样做,属性的前缀为“driver.”,例如:ding=UTF8
这将通过Connection(url,driverProperties)⽅法传递值为 UTF8 的 encoding 属性给数据库驱动。
(2)POOLED
这种数据源的实现利⽤“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。这是⼀种使得并发Web 应⽤快速响应请求的流⾏处理⽅式。
除了上述提到 UNPOOLED 下的属性外,会有更多属性⽤来配置 POOLED 的数据源:
poolMaximumActiveConnections:在任意时间可以存在的活动(也就是正在使⽤)连接数量,默认值:10
poolMaximumIdleConnections:任意时间可能存在的空闲连接数。
poolMaximumCheckoutTime:在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
poolTimeToWait:这是⼀个底层设置,如果获取连接花费的相当长的时间,它会给连接池打印状态⽇志并重新尝试获取⼀个连接(避免
在误配置的情况下⼀直安静的失败),默认值:20000 毫秒(即 20 秒)。
poolPingQuery:发送到数据库的侦测查询,⽤来检验连接是否处在正常⼯作秩序中并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有⼀个恰当的错误消息。
poolPingEnabled:是否启⽤侦测查询。若开启,也必须使⽤⼀个可执⾏的 SQL 语句设置 poolPingQuery 属性(最好是⼀个⾮常快的SQL),默认值:fal。poolPingConnectionsNotUdFor :配置 poolPingQuery 的使⽤频度。这可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值:0(即所有连接每⼀时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适⽤)。(3)JNDI
这个数据源的实现是为了能在如 EJB 或应⽤服务器这类容器中使⽤,容器可以集中或在外部配置数据源,然后放置⼀个 JNDI 上下⽂的引⽤。
这种数据源配置只需要两个属性:
initial_context:这个属性⽤来在 InitialContext 中寻找上下⽂(即,initialContext.lookup(initial_context))。这是个可选属性,如果忽略,那么 data_source 属性将会直接从 InitialContext 中寻找。
data_source:这是引⽤数据源实例位置的上下⽂的路径。提供了 initial_context 配置时会在其返回的上下⽂中进⾏查找,没有提供时则直接在 InitialContext 中查找。
和其他数据源配置类似,可以通过添加前缀“env.”直接把属性传递给初始上下⽂。⽐如:ding=UTF8
这就会在初始上下⽂(InitialContext)实例化时往它的构造⽅法传递值为 UTF8 的 encoding 属性。
⾄此,关于<environments>元素的相关配置使⽤便介绍完毕了。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

本文发布于:2023-05-12 02:17:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/593439.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:配置   连接   事务
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图