在MyBatis中,运行环境主要的作用是配置数据库信息,他可以配置多个数据库,一般而言只需要配置其中一个就可以了。她下面又分为两个可配置的元素:事务管理器(transactionManager)和数据源(dataSource)。
1、transactionManager(事务管理器)
在MyBatis中,transactionManager提供了两个实现类,它需要实现接口Transaction,它的代码如下:
public interface Transaction{
Connection getConnection() throws SQLException;
void commit() throws SQLException;
void rollback() throws SQLException;
void close() throws SQLException;
Integer getTimeout() throws SQLException;
}
从方法可知,他主要的工作就是提交(commit)、回滚(rollback)和关闭(close)数据库的事务。
因为它对应着两种工厂:JdbcTransactionFactory和ManagerTransactionFactory,这个工厂需要实现TransactionFactory接口,通过他们会生成Transaction对象。于是可以把事务管理器配置成为以下两种方式:
<transactionManager type="JDBC"></transactionManager>
<transactionManager type="MANAGED"></transactionManager>
这里做一下简要的说明:
- JDBC使用JdbcTransactionFactory生产的Transaction对象实现。它是以JDBC的方式对数据库的提交和回滚进行操作。
- MANAGED使用ManagerTransactionFactory生成ManagedTransaction对象实现。他的提交和回滚方法不用任何操作,而是把事务交给容器处理。
2、environment数据源环境
environment的主要作用时配置数据库,在MyBatis中,数据库通过三个工厂类来提供。由于存在三种数据源,所以可以有三种形式来配置他们。
<dataSource type="UNPOOLED">
<dataSource type="POOLED">
<dataSource type="JNDI">
下面我们来聊一聊这三种数据源及其属性:
1、UNPOOLED
UNPOOLED采用非数据库池的管理方式,每次请求都会打开一个新的数据库连接,所以创建会比较慢。在一些对性能没有很高要求的场合可以使用它。UNPOOLED类型的数据库源可以配置以下几种属性:
- driver:数据库驱动名
- url:连接数据库的URL
- username:用户名
- password:密码
- defaultTransactionIsolationLevel:默认的连接事务隔离级别。
2、POOLED
数据源POOLED利用“池”的概念将JDBC的Connection对象组织起来,它开始会有一些空置,并且已经连接好的数据库连接,所以请求的时候,无需再建立和验证,省去了创建新的连接实例时所需要的初始化和认证时间。它控制最大连接数,避免过多的连接导致系统瓶颈。
除了UNPOOLED下的属性外,会有更多的属性用来配置POOLED的数据源:
- poolMaximumActiveConnections:在任意时间都存在的活动连接数量,默认值为10。
- poolMaximumIdleConnections:在任意时间可能存在的空闲连接数。
- poolMaximumCheckoutTime:在被强制返回之前,池中连接被检出(check out)的时间,默认值为20000毫秒。
- poolTimeToWait:一个底层设置,如果获取连接花费了相当长的时间,他会给连接池打印状态日志,并重新尝试获取一个连接的默认值为20000毫秒。
- poolPingQuery:发送数据库的侦测查询,用来检验连接是否处在正常工作秩序中,并准备接受请求。默认是“NO PING QUERY SET"。
3、JNDI
数据源JNDI的实现是为了能在如EJB或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。这种数据源配置只需要两个属性:
- initial_context:用来在InitialContext中寻找上下文。
- data_source:引用数据源实例位置上下文中进行查询。