连接池简介
连接池里相当于一个容器,然后在里面会创建很多的连接,然后你要连接数据库,连接池就放出来一个连接,当你用完之后,就把连接池放回去,等待下一个人来使用,这样就大大节约了内存的损耗,不用老是创建和销毁连接。
连接池原理
- 连接池就是用于存储连接的容器
- 容器其实是一个集合,该集合必须是线程安全的,,不能同一个线程拿到一个连接源
- 先进先出
- 取连接源过程
Mybaits连接池分类
- UNPOOLED:采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。
- POOLED:采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
- JNDI:采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。 注意:如果不是web或者maven的war工程,是不能使用的。
Mybatis 中数据源的配置
我们的数据源配置就是在 SqlMapConfig.xml 文件中,具体配置如下:
<!-- 配置数据源(连接池)信息 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
MyBatis 在初始化时,根据<dataSource>的 type 属性来创建相应类型的的数据源 DataSource,即:
type=”POOLED”:MyBatis 会创建 PooledDataSource 实例
type=”UNPOOLED” : MyBatis 会创建 UnpooledDataSource 实例
type=”JNDI”:MyBatis 会从 JNDI 服务上查找 DataSource 实例,然后返回使用
Mybaits的事务控制
- Mybatis 中事务提交(不是自动提交)
private InputStream in;
private SqlSession session;
private IUserDao dao;
@Before//用于测试类调用之前
public void init() throws Exception{
// 第一步:读取配置文件
in = Resources.getResourceAsStream("SqlMapConifg.xml");
// 第二步:创建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
// 第三步:创建SqlSession
session = sqlSessionFactory.openSession();
// 第四步:创建Dao接口的代理对象
dao = session.getMapper(IUserDao.class);
}
@After//用于测试类执行之后
public void destory()throws Exception{
//事务提交
session.commit();
// 第六步:释放资源
session.close();
in.close();
}
@Test
public void test1()throws Exception {
// 第五步:执行dao中的方法
List<User> users= session.selectList("com.lwb.dao.IUserDao.findAll");
for(User user:users) {
System.out.println(user);
}
}
2. Mybatis 自动提交事务的设置
- 为什么没有自动提交事务,原因就是在连接池中取出的连接,都会将调用 connection.setAutoCommit(false)方法
- 所以我们通过源码可以看到,通过传递一个布尔值true就可以开始自动提交事务