什么是数据库连接池?
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
简单的来说:是一种关键的有限的昂贵的资源。
为什么要使用数据库连接池?
建立一个数据库连接是一件非常耗时(消耗时间)耗力(消耗资源)的事情。当我们进行一个简单的数据库应用,这时的需求比较少,我们对数据库的访问也不是很频繁,可以在需要访问数据库时再创建一个新的连接,用完之后就关闭它,这样做的话我们好像觉得对性能方面也没有什么影响。但是对于一个复杂的数据库应用,性能的差别就表现出来了。频繁的建立、关闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈。一个应用通常都是需要与数据库打交道,也就需要经常连接数据库,这样导致浪费大量系统资源;
连接池的原理
事先创建好几个数据库连接放在连接池中,当我们的系统需要操作数据库时就会从连接池中拿取事先创建好的连接,并将这个连接标记为"占用" ,用完后再放回连接池中,标记为“空闲”;
当连接池里的连接都在被使用,如果此时还需要连接,连接池就会再创建连接放到池里,这些连接的数量,都是在配置文件里事先定义好的;
那数据库连接池是如何管理池子中的数据库连接的呢?
这就需要说到配置文件了:
1. 应用启动时,根据配置的最小连接数,在连接池将创建此数目的数据库连接放到池中。
2. 应用访问时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。 当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留等待再次使用。
3. 应用关闭时,关闭池中所有连接,释放所有资源。
此过程会涉及的配置:最小连接数,最大连接数,最长等待时间,均配置在应用服务配置文件中。
在Java中使用得比较流行的数据库连接池主要有:DBCP,C3P0,druid。[注意]:不论使用什么连接池,低层都是使用JDBC连接,即:在应用程序中都需要加载JDBC驱动程序。
本篇只介绍DBCP、C3P0的使用;
DBCP:
https://commons.apache.org/proper/commons-dbcp/index.html
DBCP是Apache下独立的数据库连接池组件,在Tomcat中使用的连接池组件就是DBCP,支持JDBC3,JDBC4。关于更多JDBC版本信息,详见:https://en.wikipedia.org/wiki/Java_Database_Connectivity。
如何快速学习DBCP
1. 添加jar包 commons-dbcp commons-pool
2. 添加配置文件 dbcpconfig.properties
3. 开发工具类 DBCPUtils
DBCP加载配置文件时有两种方式:
- 配置文件存放在工程目录下
- 配置文件存放在src目录下
他们的实现代码略有区别:具体参考代码
public class DBCPUtils {
private static DataSource dataSource = null;
static{
try {
//实例化配置文件 加载文件
Properties properties = new Properties();
//从资源路径下加载:src/文件
InputStream inStream = DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
properties.load(inStream);
//在当前工程路径下去加载路径
//properties.load(new FileInputStream("dbcpconfig.properties"));
//从DBCP的连接池中获取连接池对象
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
C3P0:
http://www.mchange.com/projects/c3p0/
使用c3p0有多种方式,如:既可以直接使用API方式配置c3p0,也可以通过文件的方式进行配置,配置文件有2种形式:properties或xml文件。
如何快速学习C3P0
1. 添加jar包 c3p0-0.9.1.2.jar
2. 添加配置文件 c3p0-config.xml
3. 开发工具类 C3P0Utils
C3P0的局限性:配置文件不能改名,也只能放在资源目录下,即SRC目录下;
public class C3P0Utils {
private static DataSource dataSource= null;
//C3P0的局限性:不能改名,也只能放在资源目录下;
static{
dataSource = new ComboPooledDataSource();
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
Connection connection = getConnection();
System.out.println(connection);
}
}