Mybatis连接池与事务深入

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,再根据情况决定是否进行提交,这种方式更常用。我们可以根据业务情况来决定提交是否
	进行提交。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值