数据库连接池

什么是数据库连接池

当系统使用JDBC技术 访问数据库时会 创建一个connection对象,而该对象的创建过程 是非常消耗资源的,并且创建 对象的时间 也比较长,假设系统 一天有 一万次 的访问量,那么一天 就会创建 1万个connection对象,这极大的浪费数据库的资源,而且可能 造成数据库 服务器内溢出、宕机。

为了 解决上面的问题,就引入了数据库连接池 (Connection pooling),它主要用来分配,管理,释放 数据库的连接。数据库连接池 首先会创建若干(该数量可以配置)个connection对象并将 这些对象 放入到 池中,当系统 需要使用 connection对象时,数据库 连接池 会从池中分配 一个事先 创建好的connection对象 给系统,当系统 使用完毕或超时后,数据库 连接池 会将 该connection对象 重新 放入到池中。这样 就减少了创建 connection对象 所 耗费的资源和时间,可以 提高 对数据库 操作的性能。
在这里插入图片描述

模拟编写一个数据库连接池

该模拟 需要实现下面三个功能:

  • 初始化一个数据库连接池 并向里面添加10个数据库连接
  • 从连接池中获取连接
  • 当程序用完后,需要将 该连接 重新放入到 连接池中。

需要注意数据库连接池要保证线程安全:

package com.monkey1024.jdbc.pool;

import java.sql.Connection;
import java.util.Collections;
import java.util.LinkedList;

import com.monkey1024.util.DBUtil;

//只是模拟编写数据库连接池,不能用于开发使用
public class SimpleConnectionPool {
	
	//创建一个存放连接的池子,需要保证线程安全
	//因为LinkedList的添加和删除 操作效率高 ,所以 使用LinkedList作为连接池
	private static LinkedList<Connection> pool =(LinkedList<Connection>)Collections.
																synchronizedList(new LinkedList<Connection>());
	
	static {
		
		for(int i =0;i<10;i++) {
			//向连接池中放10个连接
			//创建一个数据库连接
			Connection conn = DBUtil.getConnection();
			pool.add(conn);
		}
	
	}
	
	
	//从连接池中获取 一个连接
	public static Connection getConnectionFromPool() {
		Connection conn = null;
		if(pool.size()>0) {
			//从连接池中的一个连接取出
			conn = pool.removeFirst();
			return conn;
		}else {
			//此时说明连接池中已经没有空闲连接了,需要等待
			throw new RuntimeException("服务器忙");
		}
	}
	
	
	//当程序用完后,需要将 该连接重新放入到连接池中
	public static void release(Connection conn) {
		pool.addLast(conn);
	}
	
	
}

数据库连接池规范

  • C

上节我们模拟编写了 一个数据库连接池,对于不同的开发者可能会 编写出五花八门的数据库 连接池,这对于代码后期的维护和使用会有非常多的问题,为了能够 统一数据库连接池的编写规范,让开发者编写出统一标准的数据库连接池,sun公司 提供了一个规范,该规范其实就是一个位于javax.sql包下的DataSource的接口,也叫作数据源,如果想要自己编写数据库连接池,那么需要去实现该接口,有了这个标准之后,我们只要是看到一个类实现了该接口,那就说明这个类是一个数据库连接池,该接口提供了连个重载的getConnection方法:

需要注意的地方就是 当数据库 连接使用完毕之后,不能直接关闭该连接,而是 需要 重新放入到 池中,也就是 说 数据库 连接的创建 和关闭 全部交给 数据库 连接池来管理,程序在需要的时候 直接从池中 获取,使用完毕 后 再归还给池。

Java主流常用的数据库连接池

在实际应用中,通常 不需要我们自己编写 数据库连接池,目前市面上 已经有很多组织 提供了数据库连接池,常见的主要有下面几个:

  • C3P0
  • Druid
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值