连接池
一. 连接池介绍
1.什么是连接池
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
2.连接池的优点
节省创建连接与释放连接性能消耗,连接池中连接起到复用的作用,提高程序性能
3.连接池的原理
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
4.连接池的规定
javax.sql包下有一个 DataSource,所有的支持java的连接池都应该实现javax.sql.DataSource接口,在这个接口中提供了一个方法 getConnection()它就是获取一个连接对象的。如果连接对象Connection是通过连接池获取的,当通过Connection对象调用close()方法时,不在是销毁连接对象,而是将连接对象放回到连接池。
二. dbcp连接池(本文主要介绍)
dbcp连接池介绍:DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:
commons-dbcp.jar:连接池的实现
commons-pool.jar:连接池实现的依赖库
Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用.
dbcp连接池配置(配置文件)
//properties文件内容
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
username=root
password=root
// 1.创建连接池对象
BasicDataSource ds = new BasicDataSource();
//2.加载配置信息
Properties props = new Properties();
props.load(new FileInputStream(properties配置文件路径);
//3.通过BasicDataSourceFactory获取一个连接池对象
DataSource ds = BasicDataSourceFactory.createDataSource(props);
在文章最后有实例代码演示
三. c3p0连接池
c3p0连接池介绍:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
c3p0与dbcp区别:
dbcp没有自动回收空闲连接的功能
c3p0有自动回收空闲连接功能
在使用c3p0连接池时将c3p0的jar 复制WEB-INF/lib下,我们使用的版本c3p0-0.9.1.2.jar
c3p0连接池配置(代码):
//1.创建连接池对象
ComboPooledDataSource ds = new ComboPooledDataSource();
// 2.手动配置参数
ds.setDriverClass(“com.mysql.jdbc.Driver”);
ds.setJdbcUrl(“jdbc:mysql:///day14”);
ds.setUser(“root”);
ds.setPassword(“1234”);
c3p0连接池配置(配置文件)
只要在src下创建c3p0.properties 或者 c3p0-config.xml名称的配置文件,c3p0会自动查找.
ComboPooledDataSource ds = new ComboPooledDataSource();
自动查找配置文件
在src/c3p0-config.xml
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///day14</property>
<property name="user">root</property>
<property name="password">1234</property>
</default-config>
</c3p0-config>
或者在src/c3p0.properties
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/day07
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.user=root
c3p0.password=1234
四. tomcat内置连接池
tomcat内置连接池介绍:我们在web开发中,可以将链接池交给服务器管理,如果需要时,就可以直接从服务器中获取连接对象。在tomcat中提供了一个context.xml文件,我们可以将连接池配置在这个文件中,详细信息大家可以查看tomcat帮助文档
context.xml文件可以放置在三个位置:
1.tomcat/conf下 这个配置是被服务器下所有应用所使用的.
2.tomcat/Catalina/xxx目录下,这个配置被某一个虚拟主机使用
3.在web工程的META-INF目录下创建一个context.xml文件,它是被当前工程所使用
JNDI介绍:JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,
通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。
目录服务是命名服务的一种自然扩展配置tomcat内置连接池
<Context>
<Resource name="jdbc/abc" auth="Container"
type="javax.sql.DataSource" username="root" password="1234"
driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql:///day14"
maxActive="8" maxIdle="4"/>
</Context>
获取连接的方法:
Context context = new InitialContext(); // 初始化上下文对象
Context envCtx = (Context) context.lookup(“java:comp/env”); // 固定写法
DataSource ds = (DataSource) envCtx.lookup(“jdbc/abc”);// 通过绑定名称,查找指定java对象
dbcp连接池的使用
1.搭建环境
导三个包:
2.配置properties文件
properties文件的后缀名是 .properties
文件内容如下:
#驱动
driverClassName=com.mysql.jdbc.Driver
#数据库地址
url=jdbc:mysql://localhost:3306/mydb
#数据库名称
username=root
#密码
password=root
连接池内容
package com.Dbutils;
/**
* dbcp连接池
* @author wql
*
*/
import java.io.IOException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DbUtils {
// 1.创建连接池对象
public static DataSource ds;
static {
// 2.加载配置信息
Properties p = new Properties();
try {
p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
try {
// 3.通过BasicDataSourceFactory获取一个连接池对象
ds = BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
//对外界设置一个获取连接池对象的接口
public static DataSource getDataSource() {
return ds;
}
}
连接池建立完成后使用连接池对象来操作数据库,采用DbUtils类来操作,详细介绍:http://blog.csdn.net/qq_36330228/article/details/78221281