mybatis的连接池
连接池:我们在实际开发中都会使用连接池 因为它可以减少我们获取连接所消耗的时间
连接池就是用于存储连接的一个容器 容器其实就是一个集合对象 该集合必须是线程安全的 不能两个线程拿到同一连接 该集合还必须实现队列的特性 先进先出
mybatis连接池的分类
001-POOLED
<dataSource type="POOLED">
如果将属性设置成POOLED,mybaties会创建一个数据库连接池,连接池的一个连接将会被用作数据库操作。一旦数据库操作完成,mybaties会将此连接返回给连接池。在开发或测试环境中经常用到此方式。
核心代码
//空闲连接
protected final List<PooledConnection> idleConnections = new ArrayList();
//活跃连接
protected final List<PooledConnection> activeConnections = new ArrayList();
synchronized(this.state) {
//如果空闲的连接还有
if (!this.state.idleConnections.isEmpty()) {
//remove说明就拿出来一个直接去用
conn = (PooledConnection)this.state.idleConnections.remove(0);
//如果空闲连接没有 且活动着的连接的数量 小于设定的最大数量
//那就重新new一个连接
} else if (this.state.activeConnections.size() < this.poolMaximumActiveConnections) {
conn = new PooledConnection(this.dataSource.getConnection(), this);
} else {
//假如都没有了 获取活动中最老的一个连接 然后拿出来用做一些操作重新用
PooledConnection oldestActiveConnection = (PooledConnection)this.activeConnections.get(0);
long longestCheckoutTime = oldestActiveConnection.getCheckoutTime();
002-UNPOOLED
<dataSource type="UNPOOLED">
如果将类型设置成UNPOOLED,mybaties会为每一个数据库操作创建一个新的连接,并关闭它。但是并没有使用池的思想 每次用都重新获取一个新的连接
源码
private Connection doGetConnection(Properties properties) throws SQLException {
this.initializeDriver();
Connection connection = DriverManager.getConnection(this.url, properties);
this.configureConnection(connection);
return connection;
}
就是和之前jdbc一样 注册驱动 创建连接 等
003-JNDI
<dataSource type="JNDI">
如果将类型设置成JNDI。mybaties会从在应用服务器向配置好的JNDI数据源DataSource获取数据库连接。在生产环境中优先考虑这种方式。
标签:PooledConnection,state,mybatis,new,连接,连接池 From: https://www.cnblogs.com/popopopopo/p/16982649.html