9.2.7 environments配置环境

9.2 深入Mybatis配置文件 9.2.7 environments配置环境

MyBatis的环境配置实际就是数据源的配置。MyBatis可以配置多种环境,这种机制使得MyBatis可以将SQL映射应用于多种数据库中。例如,开发、测试和生产环境需要有不同的配置;多个生产数据库想使用相同的SQL映射等等。

每个数据库对应一个SqlSessionFactory

尽管可以配置多个环境,但是每个SqlSessionFactory实例只能选择一个环境,即每个数据库对应一个SqlSessionFactory实例。所以,如果你想连接两个数据库,就需要创建两个SqlSessionFactory实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推。

环境配置示例

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
<!-- 环境配置,即连接的数据库。 -->
<environments default="development">
<environment id="development">
<!-- 指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
<transactionManager type="JDBC">
<property
name="..."
value="..."/>
</transactionManager>
<!-- dataSource指数据源配置,POOLED是JDBC连接对象的数据源连接池的实现。 -->
<dataSource type="POOLED">
<!-- 使用配置文件db.properties中设置的driver属性值给该driver属性赋值 -->
<property
name="driver"
value="${driver}"/>
<!-- 使用配置文件db.properties中设置的url属性值给该url属性赋值 -->
<property
name="url"
value="${url}"/>
<!-- 使用配置文件db.properties中设置的username属性值给该username属性赋值 -->
<property
name="username"
value="${username}"/>
<!-- 使用配置文件db.properties中设置的password属性值给该password属性赋值 -->
<property
name="password"
value="${password}"/>
</dataSource>
</environment>
</environments>

环境配置关键点

注意这里的关键点:

  • 默认的环境id(比如:<environments default="development">)
  • 每个<environment>元素定义的环境id(比如:<environment id="development">
    • 事务管理器<transactionManager>的配置(比如:<transactionManager type="JDBC">)。
    • 数据源<dataSource>的配置(比如:<dataSource type="POOLED">)

environment配置

环境<environment>id可以随意命名,建议简洁有意义,而environments的默认环境一定要匹配定义的其中一个环境

transactionManager配置

事务管理器类型

<transactionManager>标签,表示事务管理器配置,在MyBatis中有JDBCMANAGED两种类型的事务管理器:

  • JDBC,这个配置直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。
  • MANAGED(managed),这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如Java EE应用服务器的上下文)。默认情况下它会关闭连接然而一些容器并不希望这样,可以将closeConnection属性设置为false来阻止它默认的关闭行为:
managed类型事务管理示例

<transactionManager>MANAGED配置示例如下

1
2
3
4
5
<transactionManager type="managed">
<property
name="closeConnection"
value="false"/>
</transactionManager>

使用Spring+MyBatis不需要配置事务管理器

如果开发者使用Spring+MyBatis,则没有必要配置事务管理器,因为Spring模块会使用自带的管理器来覆盖MyBatis的事务管理器配置

dataSource配置

<dataSource>标签表示数据源配置,在MyBatis中有UNPOOLEDPOOLEDJNDI种数据源类型

UNPOOLED数据源类型

UNPOOLED这个数据源的实现只是每次被请求时打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择。不同的数据库在这方面表现也是不一样的。
UNPOOLED类型的数据源仅仅需要配置以下5种属性

  • driver。这是JDBC驱动的Java类的完全限定名( 并不是JDBC驱动中可能包含的数据源类)。
  • url。这是数据库的JDBC URL地址。
  • username。登录数据库的用户名。
  • password。登录数据库的密码。
  • defaultTransactionIsolationLevel。默认的连接事务隔离级别。

POOLED数据源类型

POOLED: 这种数据源的实现利用“池” 的概念将JDBC连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。这是一种使得并发Web应用快速响应请求的流行处理方式。除了上述提到的UNPOOLED的5种属性外,还可以使用更多属性来配置POOLED的数据源:

  • poolMaximumActiveConnections。在任意时间可以存在的活动( 也就是正在使用) 连接数量,默认值是 10。
  • poolMaximumIdleConnections。任意时间可能存在的空闲连接数。
  • poolMaximumCheckoutTime。在被强制返回之前,池中连接被检出(checked out) 时间,默认值为 20000ms( 即 20 s)poolTimeToWait。这是一个底层设置,如果获取连接花费相当长的时间,它会给连接池打印状态日志并重新尝试获取一个连接( 避免在误配置的情况下一直安静地失败),默认值为 20000ms( 即 20 s)。
  • poolPingQuery。发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。
  • poolPingEnabled。是否启用侦测查询。若开启,也必须使用一个可执行的SQL语句设置poolPingQuery属性(最好是一个非常快的SQL),默认值为false
  • poolPingConnectionsNotUsedFor。配置poolPingQuery的使用频度。其可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值为0(即所有连接每一时刻都被侦测,当然仅当poolPingEnabledtrue时适用)。
  • JNDI。这个数据源的实现是为了能在如EJB或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。这种数据源配置只需要两个属性:
    • initial_context。这个属性用来在InitialContext中寻找上下文(即initialContext.lookup(initial_context))。这是个可选属性,如果忽略,那么data_source属性将会直接从InitialContext中寻找。
    • data_source。这是引用数据源实例位置的上下文路径。若提供了initial_context配置则会在其返回的上下文中进行查找,没有提供则直接在InitialContext中查找dataSourceJDNI配置示例如下:
1
2
3
4
<dataSource type="JNDI">
<property name="initial_context" value="java:/comp/env"/>
<property name="data_source" value="fkjavads"/>
</dataSource>

其中“java:/comp/env”是Tomcat服务器的前缀,每个Web服务器的前缀都不一样,具体请査看Web服务器相关文档。