Mybatis的连接池技术
Mybatis中的连接池技术,它采用的是自己的连接池,在Mybatis的SqlMapConfig.xml配置文件中,通过<dataSource type="POOLED">来实现Mybatis中连接池的配置。
Mybatis连接池的分类
Mybatis连接池提供了3种方式的配置:
配置的位置:主配置文件SqlMapConfig.xml中的dataSource标签。
type属性就是表示采用何种连接池技术:
type属性的取值:
POOLED:采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现。
UNPOOLED:采用传统的获取连接的方式,虽然也实现了javax.sql.DataSource接口,但是并没有使用池的思想。
JNDI:采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器能拿到的DataSource是不一样的
注意:如果不是web或者maven的war工程,是不能使用的。
我们这里使用的是tomcat服务器,采用的都是dbcp连接池。
相应的,Mybatis内部定义了实现java.sql.DataSource接口的UnpooledDataSource,PooledDataSource类来表示UNPOOLED,POOLED类型的数据源。三种数据源中,我们常用的就是POOLED数据源(很多时候我们所说的数据源就是为了更好的管理数据库连接,也就是我们说的连接池技术)
Mybatis数据源的配置
我们的数据源配置就是在SqlMapConfig.xml文件中,具体配置如下:
<!--配置连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
Mybatis在初始化时,根据<dataSource>的type属性来创建相应类型的数据源DataSource,即:
type="POOLED":Mybatis会创建PooledDataSource实例
type="UNPOOLED":Mybatis会创建UnpooledDataSource实例
type="JNDI":Mybatis会从JNDI服务上查找DataSource实例,然后返回使用
mybatis连接池的3种配置方式
1.POOLED
采用传统的javax. sql. DataSource规范中的连接池.一旦数据库操作完成,mybaties会将此连接返回给连接池。。
SqlMapConfig.xml中的配置:
<dataSource type="POOLED">
<property name="driver" value=""></property>
<property name="url" value=""></property>
<property name="username" value=""></property>
<property name="password" value=""></property>
</dataSource>
2.UNPOOLED
采用传统的获取连接的方式,同样实现Javax. sql. DataSourcel,不过没有使用池的思想。也就是说mybaties会为每一个数据库操作创建一个新的连接,使用完就关闭它。
SqlMapConfig.xml中的配置:
<dataSource type="UNPOOLED">
<property name="driver" value=""></property>
<property name="url" value=""></property>
<property name="username" value=""></property>
<property name="password" value=""></property>
</dataSource>
3.JNDI
是SUN公司推出的一套规范,属于JavaEE技术之一。目的是模仿windows系统中的注册表。采用服务器提供的JNDI技术实现,来获取DataSource对 象,不同的服务器所能拿到DataSource是不一样。
mybaties会从在应用服务器向配置好的JNDI数据源DataSource获取数据库连接。一般在生产环境中使用。
SqlMapConfig.xml中的配置:
<environments default= "mysql">
<environment id= "mysql">
<transact ionManager type =”JDBC">< / transact ionManager>
<dataSource type= ”JNDI" >
<property name= ”data_ source" value= "java : comp/ env/ jdbc/数据库名>
</dataSource>
</environment>
</ environments>
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/test" 数据源的名称
type="javax.sql.DataSource" 数据源类型
auth="Container" 数据源提供者
maxActive="20" 最大活动数
maxWait="10000" 最大等待时间
maxIdle="5" 最大空闲数
username="root" 用户名
password="1234" 密码
driverClassName="com.mysql.jdbc.Driver" 驱动类
url="jdbc:mysql://localhost:3306/eesy_mybatis" 连接url字符串
/>
Mybatis中DataSource的存取
Mybatis是通过工厂模式来创建数据源DataSource对象的,Mybatis定义了抽象的工厂接口:org.apache.ibatis.datasource.DataSourceFactory,通过其getDataSource() 方法返回数据源DataSource.
下面是DataSourceFactory的源码:
package org.apache.ibatis.datasource;
import java.util.Properties;
import javax.sql.DataSource;
public interface DataSourceFactory {
void setProperties(Properties var1);
DataSource getDataSource();
}
Mybatis创建了DataSource实例后,会将其Configuration对象内的Environment对象中,供以后使用。
具体分析过程如下:
1.先进入XMLConfigBuilder类中,可以找到如下代码:
2.再分析configuration对象的environment属性
Mybatis中连接的获取过程分析
当我们需要创建SqlSession对象并需要执行SQL语句时,这时候Mybatis才会去调用dataSource对象来创建java.sql.Connection对象,也就是说,java.sql.Connection对象的创建一直延迟到执行SQL语句的时候。
@Test
public void testSql() throws Exception {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = factory.openSession();
List<User> list = sqlSession.selectList("findUserById",41);
System.out.println(list.size());
}
只有当第4句sqlSession.selectList("findUserById"),才会触发Mybatis在底层执行下面这个方法来创建java.sql.Connection对象。
Mybatis中数据库的type属性
Mybatis的事务控制
JDBC中事务的回顾
在jdbc中我们可以将事务的提交方式改为手动方式,通过setAutoCommit()方法就可以调整。通过JDK文档,我们找到以下方法:
setAutoCommit:将此连接的自动提交模式设定为给定状态。如果连接处于自动提交模式下,则它的所有SQL语句将被执行并
作为单个事务提交,否则,它的SQL语句将集中到事务中,直到调用commit方法或者rollback方法为止。默认情况下,新连接处
于自动提交模式。
那么我们的Mybatis框架因为是对JDBC的封装,所以Mybatis框架的事务控制方式,本身也是用JDBC的setAutoCommit()方法来
设置事务提交方式的。
Mybatis中事务提交方式
我们发现,此时事务就设置为自动提交了,同样可以实现CUD操作时记录的保存。虽然这也是一种方式,但就编程而言,
设置为自动提交方式为false,再根据情况决定是否进行提交,这种方式更常用。我们可以根据业务情况来决定提交是否
进行提交。