深入MyBatis配置:environments配置环境

MyBatis的环境配置实际就是数据源的配置,MyBatis可以配置多种环境,这种机制是的MyBatis可以将SQL映射应用于多种数据库中.例如,开发,测试和生产环境需要有不同的配置:多个生产数据库想使用相同的SQL映射,等等.
尽管可以配置多个环境,但是每个SqlSessionFactory实例只能选择一个环境,即每个数据库对应一个SqlSessionFactory实例,所以,如果你想连接两个数据库,就需要创建两个SqlSessionFactory实例,每个数据库对应一个,而如果是三个数据库,就需要三个实例,以此类推.
<!-- 环境配置,即链接的数据库 -->
<environments default="mysql">
    <environment id="mysql">
        <!-- 指定事务管理类型,type="JDBC"指直接简单使用JDBC的提交和回滚设置 -->
        <transactionManager type="JDBC"></transactionManager>
        <!-- dateSource指数据源配置,POOLED是JDBC链接对象的数据源连接池的实现 -->
        <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
每个environment元素定义的环境ID
事务管理器的配置
数据源的配置
环境ID可以随意命名,建立简洁有意义,而默认环境一定要匹配定义的其中一个环境ID.
<transactionManager…/>表示事务管理器配置,在MyBatis中有JDBC和MANAGED两种类型的事务管理器
JDBC:这个配置就是直接使用了JDBC的提交和回滚设置,他依赖于从数据源得到的连接来管理事务范围
MANAGED:这个配置几乎没做什么,他从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JAEE应用服务器的上下文),默认情况他会关闭连接,然而一些容器并不希望这样,可以将closeConnection属性设置为false来阻止他默认关闭行为.
<transactionManger type="MANAGED">
    <property name="closeConnection" value="false" />
</transaction>
如果开发者使用Spring+MyBatis则没有必要配置事务管理器,因为Spring模块会使用自带的管理器来覆盖前面的配置.
<dataSource…/>表示数据源配置,在MyBatis中有UNPOOLED,POOLED和JNDI三种数据源类型:
UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接,他对没有性能要求的简单应用程序是一个很好的选择.不同数据库在这方面的表现也是不一样的.UNPOOLED类型的数据源仅仅需要配置以下5种属性:
driver:这是JDBC驱动的java类完全限定名
url:数据库JDBC URL地址
username:用户名
password:密码
defaultTransactionIsolcationLevel:默认的连接事务隔离级别
POOLED:这种数据源的实现利用池的概念将JDBC连接对象组织起来,避免了创建新的连接实例时说必须的初始化和认证时间.这是一种使得并发web应用快速相应请求的流行处理方式.除了上述提到的UNPOOLED的5种属性外,还可以使用更多属性来配置POOLED数据源:
poolMaximumActiveConnections:在任意时间可以存在的活动(也就是正在使用)连接数量,默认值10
poolMaximumldleConnections:任意时间可能存在的空闲连接数
poolMaximumCheckoutTime:在被强制返回之前,池中接连被检出时间,默认值为20000毫秒
poolTimeToWait:这是一个底层设置,如果获取连接花费相当长时间,他会给连接池打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败)默认值为20000毫秒
poolPingQuery:发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中并准备接收请求.默认是 NO PING QUERY SET,这会导致多数数据库驱动失败时带有一个恰当的错误消息.
poolPingEnabled:是否启用侦测查询,若开启,也必须使用一个可执行的SQL语句设置poolPingQuery属性,默认值为false
poolPingConnectionsNotUsedFor:配置poolPingEnabled的使用频度,这可以被设置成匹配具体的数据库连接超时时间,来避免不西药的侦测,默认值为0(即所有连接每一时刻都被侦测,当然仅当poolPingEnabled为true时使用)
JDNI
这个数据源的实现是为了能在如EJB或应用服务器这类容器中使用,容器可以几种或在外部配置数据源,然后放置一个JNDI上下文引用,这种数据源配置只需要两个属性:
initial_context:这个属性用来在InitialContext中寻找上下文
date_source 这是应用数据源实例位置的上下文路径