数据库连接池
一、数据库连接池概述
数据库连接池(也即是数据源),他是借助于池化思想,允许应用程序重复使用一个现有的数据库连接;他主要用于负责分配、管理和释放数据库连接。
(一)数据库连接池原理
1.连接池开启后:系统启动的时候就创建了一定数量的连接对象;
2.连接池使用时:直接从连接池中去获取,不需要自己来创建连接对象;
3.关闭时就会把数据库连接池放回连接池内,供下个用户使用。
(二)使用数据源的理由
JDBC访问数据库的每个增删改查的操作都需要先创建连接不能共享的连接对象;每个用户每次访问都必须创建一个连接对象,并且这个连接对象应该设置成局部变量。
1. 经过测试,每次访问数据库最耗时的部分就是创建连接对象。
2. 每次使用完连接对象以后,就马上关闭。
(三)数据库连接池接口
1.数据源的接口是:javax.sql.DataSource,他的实现类由各大数据厂商去实现。
2.数据源中获取连接对象:DataSoure.getConnection
(四)数据库连接池参数
1.初始连接数:服务器启动的时候创建的连接对象数量
2.最大连接数:连接池中最多可以允许放多少个连接对象
3.最长等待时间:如果连接池中没有连接对象,设置用户等待的最长时间是多久,单位是毫秒;如果超过这个时间就抛出异常
4.最长空闲时间:如果一个连接对象长时间没有人使用,设置多久回收这个对象,默认是不回收。
二、C30P0数据连接池
(一) c3p0 连接池—配置文件
1、配置文件要求:文件名必须叫c3p0-config.xml;路径必须放在src目录下;
2、配置文件内容:内容分为默认配置和命名配置。
总结:多个配置的好处在于,可使用不同连接池参数,指定不同的数据库名,同时也能使用不同厂商的数据库。
<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
<!--1.默认配置 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!--连接字符串URL-->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day24</property>
<!--用户名-->
<property name="user">root</property>
<!--密码-->
<property name="password">root</property>
<!--2.连接池配置有关的参数-->
<property name="initialPoolSize">5</property>
<!--最大连接数-->
<property name="maxPoolSize">10</property>
<!--过多久没有获取连接,超时抛出异常-->
<property name="checkoutTimeout">3000</property>
</default-config>
<!--3.命名配置,可以使用多个-->
<named-config name="otherc3p0">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">3</property>
<property name="maxPoolSize">15</property>
<property name="checkoutTimeout">2000</property>
</named-config>
</c3p0-config>
(二) c3p0 连接池—构造方法
1、使用默认配置创建连接池对象:ComboPooledDataSource();
2、使用命名配置创建连接池对象:ComboPooledDataSource(配置名);
(三) c3p0 连接池—使用步骤
1、导入C30P0依赖包(2个)+数据库驱动包
2、src目录下编写(配置)c3p0-config.xml
3、创建数据源的实现类:ComboPooledDataSource();
public class Demo1C3p0 {
public static void main(String[] args) throws Exception {
//1.使用默认配置,创建连接池。
new ComboPooledDataSource().var
//2.使用命名配置,创建连接池。
new ComboPooledDataSource("c3p01").var
//3.连接池中获取连接对象
new ComboPooledDataSource().getConnection().var
}
}
三、Druid数据连接池
(一)druid数据连接池—环境搭建
1、下载地址:https://github.com/alibaba/druid
2、依赖的包: druid-1.0.9.jar
3、配置文件:druid.properties,放在src目录下
(二)druid数据连接池—配置文件
url=jdbc:mysql://ip名:3306/数据库名
username=用户名
password=密码
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10
maxWait=2000
(三)druid数据连接池—使用步骤
/*
1. 创建配置文件,扩展名是.properties
2. 读取配置文件,得到输入流对象
3. 使用Properties类的load()方法加载配置
4. 通过Druid的工厂类:createDataSource()创建连接池。DruidDataSourceFactory.createDataSource()
*/
public class Demo2Druid {
public static void main(String[] args) throws Exception {
//1.获取字节输入流,加载配置文件;如果不指定路径,默认是读取同一个包下资源文件
InputStream inputStream = Demo2Druid.class.getClassLoader().getResourceAsStream("/druid.properties");
//2.创建Properties对象
Properties properties = new Properties();
//3.加载配置文件中所有属性
properties.load(inputStream);
//3.通过druid的工厂类创建连接池,获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//4.获取连接对象
Connection con=dataSource.getConnection()
}
}
连接池工具类
(一) 连接池工具类—使用目的
每次使用JDBC的时候都要书写冗长的代码段,不利于代码的复用,于是要单独写一个类,将通用的JDBC操作写到一个类中,便于重复使用和精简代码。
(二) 连接池工具类—DataSoureUtils
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DataSourceUtils {
//1.私有构造方法
private DataSourceUtils(){}
//2.声明数据源变量
private static DataSource dataSource;
//3.提供静态代码块,完成配置文件的加载和获取数据库连接池对象
static{
try{
//完成配置文件的加载
InputStream is = DataSourceUtils.class.getClassLoader().getResourceAsStream("druid.properties");
Properties prop = new Properties();
prop.load(is);
//获取数据库连接池对象
dataSource = DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
//4.提供一个获取数据库连接的方法
public static Connection getConnection() {
Connection con = null;
try {
con = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
//5.提供一个获取数据库连接池对象的方法
public static DataSource getDataSource() {
return dataSource;
}
//6.释放资源
public static void close(Connection con, Statement stat, ResultSet rs) {
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection con, Statement stat) {
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}