实用 | Mybatis连接池

一、连接池分类

dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

  • 许多 MyBatis 的应用程序会按示例中的例子来配置数据源。虽然这是可选的,但为了使用延迟加载,数据源是必须配置的。

有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”)

二、内部连接池

1、说明

这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需
的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。

2、示例

<dataSource type="POOLED">
  <property name="driver" value="${db.driver}"/>
  <property name="url" value="${db.url}"/>
  <property name="username" value="${db.username}"/>
  <property name="password" value="${db.password}"/>
</dataSource>

3、演示

@Test
public void testPooled(){
  UserDaoImpl dao = new UserDaoImpl();
  User user = dao.findById(24);
  System.out.println(user);
  System.out.println("--------------------- 分 割 线 ----------------------");
  User user2 = dao.findById(24);
  System.out.println(user2);
}

[com.mysql.cj.jdbc.ConnectionImpl@5b43fbf6]
DEBUG [main] - > Preparing: select * from user where id =?
DEBUG [main] - ==> Parameters: 24(Integer)
DEBUG [main] - < Total: 1
DEBUG [main] - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@5b43fbf6]
DEBUG [main] - Returned connection 1531182070 to pool.
User{id=24, username='张三丰', birthday=null, sex='1', address='河南郑州'}
--------------------- 分 割 线 ----------------------
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Checked out connection 1531182070 from pool.
DEBUG [main] - Setting autocommit to false on JDBC Connection
[com.mysql.cj.jdbc.ConnectionImpl@5b43fbf6]
DEBUG [main] - > Preparing: select * from user where id =?
DEBUG [main] - ==> Parameters: 24(Integer)
DEBUG [main] - < Total: 1
DEBUG [main] - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@5b43fbf6]
DEBUG [main] - Returned connection 1531182070 to pool.
User{id=24, username='张三丰', birthday=null, sex='1', address='河南郑州'}
Disconnected from the target VM, address: '127.0.0.1:52903', transport: 'socket'

三、不用连接池

1、说明

这个数据源的实现只是 每次被请求时打开和关闭连接。虽然有点慢,但对于在数据库连接可用性方
面没有太高要求的简单应用程序来说,是一个很好的选择。

2、示例

<dataSource type="UNPOOLED">
 <property name="driver" value="com.mysql.jdbc.Driver"/>
 <property name="url" value="jdbc:mybsql:///mybatisdb"/>
 <property name="username" value="root"/>
 <property name="password" value="root"/>
</dataSource>

3、演示

@Test
public void testUnPool(){
  UserDaoImpl dao = new UserDaoImpl();
  User user = dao.findById(24);
  System.out.println(user);
  System.out.println("--------------------- 分 割 线 ----------------------");
  User user2 = dao.findById(24);
  System.out.println(user2);
}

[com.mysql.cj.jdbc.ConnectionImpl@6f8f9349]
DEBUG [main] - > Preparing: select * from user where id =?
DEBUG [main] - ==> Parameters: 24(Integer)
DEBUG [main] - < Total: 1
DEBUG [main] - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6f8f9349]
User{id=24, username='张三丰', birthday=null, sex='1', address='河南郑州'}
--------------------- 分 割 线 ----------------------
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Setting autocommit to false on JDBC Connection
[com.mysql.cj.jdbc.ConnectionImpl@31e75d13]
DEBUG [main] - > Preparing: select * from user where id =?
DEBUG [main] - ==> Parameters: 24(Integer)
DEBUG [main] - < Total: 1
DEBUG [main] - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@31e75d13]
User{id=24, username='张三丰', birthday=null, sex='1', address='河南郑州'}
Disconnected from the target VM, address: '127.0.0.1:52180', transport: 'socket'

四、外部连接池

1、说明

这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数
据源,然后放置一个 JNDI 上下文的引用。

2、示例

<dataSource type="com.itheima.mybatis.day03.pool.jndi.C3P0DataSourceFactory">
  <property name="driverClass" value="${db.driver}"/>
  <property name="jdbcUrl" value="${db.url}"/>
  <property name="user" value="${db.username}"/>
  <property name="password" value="${db.password}"/>
  <property name="maxPoolSize" value="${db.maxPoolSize}"/>
</dataSource>
public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {
 public C3P0DataSourceFactory() {
  this.dataSource = new ComboPooledDataSource();
}
}

3、演示

public void testJndi(){
  UserDaoImpl dao = new UserDaoImpl();
  User user = dao.findById(24);
  System.out.println(user);
  System.out.println("--------------------- 分 割 线 ----------------------");
  User user2 = dao.findById(24);
  System.out.println(user2);
}

DEBUG [main] - Created new pool for auth, username (masked): 'ro**'.
DEBUG [main] - acquire test -- pool size: 0; target_pool_size: 1; desired target? 1
DEBUG [main] - awaitAvailable(): [unknown]
DEBUG [main] - Setting autocommit to false on JDBC Connection
[com.mchange.v2.c3p0.impl.NewProxyConnection@68d279ec [wrapping:
com.mysql.cj.jdbc.ConnectionImpl@258d79be]]
DEBUG [main] - > Preparing: select * from user where id =?
DEBUG [main] - ==> Parameters: 24(Integer)
DEBUG [main] - < Total: 1
DEBUG [main] - Closing JDBC Connection
[com.mchange.v2.c3p0.impl.NewProxyConnection@68d279ec [wrapping:
com.mysql.cj.jdbc.ConnectionImpl@258d79be]]
User{id=24, username='张三丰', birthday=null, sex='1', address='河南郑州'}
--------------------- 分 割 线 ----------------------
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Setting autocommit to false on JDBC Connection
[com.mchange.v2.c3p0.impl.NewProxyConnection@4c1f22f3 [wrapping:
com.mysql.cj.jdbc.ConnectionImpl@258d79be]]
DEBUG [main] - > Preparing: select * from user where id =?
DEBUG [main] - ==> Parameters: 24(Integer)
DEBUG [main] - < Total: 1
DEBUG [main] - Closing JDBC Connection
[com.mchange.v2.c3p0.impl.NewProxyConnection@4c1f22f3 [wrapping:
com.mysql.cj.jdbc.ConnectionImpl@258d79be]]
User{id=24, username='张三丰', birthday=null, sex='1', address='河南郑州'}
Disconnected from the target VM, address: '127.0.0.1:52518', transport: 'socket'

4、注意

  • <dataSource type=为外部类路径并且该类需要实现DataSourceFactory
  • <property name="driverClass"必须与外部类中的setter方法一致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值