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
的id
可以随意命名,建议简洁有意义,而environments
的默认环境一定要匹配定义的其中一个环境
事务管理器配置
事务管理器类型
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
标签表示数据源配置,在MyBatis
中有UNPOOLED
、POOLED
和JNDI
种数据源类型
unpooled
UNPOOLED
(unpooled)
。这个数据源的实现只是每次被请求时打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择。不同的数据库在这方面表现也是不一样的。UNPOOLED
类型的数据源仅仅需要配置以下5种属性
poolMaximumActiveConnections
。在任意时间可以存在的活动(也就是正在使用)连接数量,默认值是10。poolMaximumIdleConnections
。任意时间可能存在的空闲连接数poolMaximumCheckoutTime
。在被强制返回之前,池中连接被检出(checkedout)
时间,默认值为20000ms(
即20s)
poolTimeToWait
。这是一个底层设置,如果获取连接花费相当长的时间,它会给连接池打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静地失败),默认值为20000ms(即20s)。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
配置示例如下:
懒得打字示例省略