9.2.7 environments配置环境
9.2 深入Mybatis配置文件 9.2.7 environments配置环境
MyBatis
的环境配置实际就是数据源的配置。MyBatis
可以配置多种环境,这种机制使得MyBatis
可以将SQL
映射应用于多种数据库中。例如,开发、测试和生产环境需要有不同的配置;多个生产数据库想使用相同的SQL
映射等等。
每个数据库对应一个SqlSessionFactory
尽管可以配置多个环境,但是每个SqlSessionFactory
实例只能选择一个环境,即每个数据库对应一个SqlSessionFactory
实例。所以,如果你想连接两个数据库,就需要创建两个SqlSessionFactory
实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推。
环境配置示例
1 | <!-- 环境配置,即连接的数据库。 --> |
环境配置关键点
注意这里的关键点:
- 默认的环境
id
(比如:<environments default="development">
) - 每个
<environment>
元素定义的环境id
(比如:<environment id="development">
- 事务管理器
<transactionManager>
的配置(比如:<transactionManager type="JDBC">
)。 - 数据源
<dataSource>
的配置(比如:<dataSource type="POOLED">
)
- 事务管理器
environment配置
环境<environment>
的id
可以随意命名,建议简洁有意义,而environments
的默认环境一定要匹配定义的其中一个环境
transactionManager配置
事务管理器类型
<transactionManager>
标签,表示事务管理器配置,在MyBatis
中有JDBC
和MANAGED
两种类型的事务管理器:
JDBC
,这个配置直接使用了JDBC
的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。MANAGED
(managed
),这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如Java EE
应用服务器的上下文)。默认情况下它会关闭连接然而一些容器并不希望这样,可以将closeConnection
属性设置为false
来阻止它默认的关闭行为:
managed类型事务管理示例
<transactionManager>
的MANAGED
配置示例如下
1 | <transactionManager type="managed"> |
使用Spring+MyBatis不需要配置事务管理器
如果开发者使用Spring+MyBatis
,则没有必要配置事务管理器,因为Spring
模块会使用自带的管理器来覆盖MyBatis
的事务管理器配置
dataSource配置
<dataSource>
标签表示数据源配置,在MyBatis
中有UNPOOLED
、POOLED
和JNDI
种数据源类型
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(即所有连接每一时刻都被侦测,当然仅当poolPingEnabled
为true
时适用)。JNDI
。这个数据源的实现是为了能在如EJB
或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI
上下文的引用。这种数据源配置只需要两个属性:initial_context
。这个属性用来在InitialContext
中寻找上下文(即initialContext.lookup(initial_context))
。这是个可选属性,如果忽略,那么data_source
属性将会直接从InitialContext
中寻找。data_source
。这是引用数据源实例位置的上下文路径。若提供了initial_context
配置则会在其返回的上下文中进行查找,没有提供则直接在InitialContext
中查找dataSource
的JDNI
配置示例如下:
1 | <dataSource type="JNDI"> |
其中“java:/comp/env
”是Tomcat
服务器的前缀,每个Web
服务器的前缀都不一样,具体请査看Web
服务器相关文档。