数据库连接池
1、什么是数据库连接池?
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
这项技术能明显提高对数据库操作的性能。
2、连接池解决的问题???
不断的创建、销毁链接,会导致访问数据库服务器的压力,而且对于内存来说,不断的开辟与销毁,内存的使用率极低。使用数据库连接池可以明显提高对数据库操作的性能!
数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并将这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库连接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。
3、数据库连接池的工作原理???
1、三步骤 连接池的建立,连接池中连接的使用管理,连接池的关闭
一、连接池的建立:创建几个连接对象,以便使用的时候能从连接池中获取
二、客户请求数据库连接时,首先查看连接池中是否有空闲连接,若存在,将连接分配给用户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大的连接数,如果没有达到,就重新创建一个连接给请求的客户,如果达到就按照设定的最大等待时间进行等待,超出的最大等待的时间,就抛出异常给用户,当用户释放数据连接的时候,先判断该连接的引用次数是否超过了规定的值,如果超过就删除,如果没有的话,就保留为其他客户服务。保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源的资源开销。
三、连接池的关闭,当应用程序退出的时候i,关闭所有的连接,释放相关的资源,正好与创建相反
4、数据库连接配置时的参数(可选,有默认值)
最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费.
最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作
最大空闲时间:连接池对象最长的闲置时间,如果长时间没有被使用,那么此连接对象就会被销毁。
获取连接超时时间:池子中总共有50条连接,当这50条连接都处于工作状态时,第51个连接请求到达,让其加入到等待队列中,等待时间如果超过了设置的超时时间,则抛出异常
初始化连接数:当数据库连接池创建时,初始化的连接数量
5、主流的数据库连接池技术
创建QueryRunner时,可以传递一个数据源DataSource,我们可以将这个数据源理解为数据库连接池,那么我们现在使用不同的数据库连接池技术,目的就只有一个,得到数据源对象
6、DBCP
介绍:DBCP(DataBase Connection Pool)属于Apache顶级项目Commons中的核心子项目(最早在Jakarta Commons里就有),它内部依赖于Commons中的另一个子项目Pool,连接池最核心的“池”,就是由Pool组件提供的,因此,DBCP的性能实际上就是Pool的性能
步骤:
导包 build path
书写dbcp.properties属性文件,文件目录在src下
书写dbcp工具类,来提供数据源
测试数据源是否可用
7、封装一个工具类,专门用于向外界提供dbcp的数据源。
/**
* 此类的作用就是生成并且提供dbcp的数据源
* @author Administrator
*
*/
public class DBCPUtils {
private static DataSource dataSource = null;
//完成对数据源的赋值,赋值只需要走一次,所以在静态代码块中完成赋值
static {
Properties properties = new Properties();
FileInputStream fStream = null;
try {
//创建输入流对象,来读取配置文件dbcp.properties
fStream = new FileInputStream("src/dbcp.properties");
//将流中读取到的内容加载属性文件对象中
properties.load(fStream);
//将加载完毕内容的属性文件对象传递到dbcp创建数据源的方法中,生成数据源
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//返回数据源的方法
public static DataSource getDataSource() {
return dataSource;
}
}