一、连接池分类
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方法一致