数据库连接池
什么是数据库连接池:
在使用JDBC编程时,每次访问数据库都需要创建对象,访问完毕后也需要断开连接(销毁对象)。为了避免频繁的创建数据库连接,提出来数据库连接池技术。
应用程序就不需要创建和断开连接对象,而是交给数据库连接池管理。
数据库连接池断开,不是销毁对象,而是把连接对象归还给连接池。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用现有的数据库连接,而不是重新建立。
采用数据库连接池操作数据库的示意图:
优点:通过数据库连接池管理连接对象,减少了数据库连接对象的创建和销毁,提高了数据库的访问效率。
数据库连接池基本参数:
1.初始化大小:数据库连接池里面初始的连接对象个数
2.最大连接数:数据库连接池里面最大的连接对象个数
3.最大等待时间:用户通过连接池取连接对象时,需要等待的世界
4.最大空闲连接:数据库连接池里面,在用户访问趋于稳定时,最大空闲连接个数
5.最小空闲连接:在用户访问趋于顶峰时,数据库连接池里面剩余的最小连接对象个数。
DataSource接口
为了获取数据库连接对象(Connection),JDBC提供了javax.sql.DataSource接口,它负责与数据库建立连接,并定义了返回值Connection对象的方法:
Connection getConnection()
Connection getConnection(String username,String password)
习惯性的把实现了javax.sql.DataSource接口的类称为数据源,即数据的来源。在数据源中存储了所有建立数据库连接的信息。
DBCP数据源
DBCP数据源连接池(DataBase Connection Pool),是由apache组织提供的数据库连接池技术,开源免费。
在项目开发中,使用DBCP的基本步骤:
前提导入DBCP的jar包:commons-dbcp.jar,commons-pool.jar
DBCP获取连接对象:设置连接参数。四个连接参数:driverName,url,username,password
package cn.itcast.chapter10.example;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class Example01 {
public static DataSource ds = null;
static {
//获取DBCP数据源实现类对象
BasicDataSource bds = new BasicDataSource();
//设置连接数据库所需要的四个连接参数
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jbdc:mysql://localhost:3306/jdbc");
bds.setUsername("root");
bds.setPassword(null);
//设置连接池参数
bds.setInitialSize(5); //初始化参数
bds.setMaxIdle(10);
ds = bds;
}
public static void main(String[] args) throws SQLException {
//数据库连接池获取连接对象
Connection con = ds.getConnection();
//获取连接参数
DatabaseMetaData metaData = con.getMetaData();
System.out.println(metaData.getURL());
System.out.println(metaData.getUserName());
System.out.println(metaData.getDriverName());
}
}
BasicDataSource类的常用方法:
C3P0数据源
C3P0数据源是目前最流行的数据库连接池技术之一,它的性能更加优越,也提供了对后期数据框架hibernate很好的支持,它是开源免费的。
在项目开发中,使用C3P0的基本步骤:
前提导入C3P0的jar包,提供了C3P0的核心类方法
设置连接参数:四个连接参数:driverName,url,username,password
package cn.itcast.chapter10.example;
import java.beans.PropertyVetoException;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class Example02 {
public static DataSource ds = null;
// 初始化C3P0数据源
static {
ComboPooledDataSource cpds = new ComboPooledDataSource();
try {
// 设置四个连接参数
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc");
cpds.setUser("root");
cpds.setPassword("");
// 设置连接池参数
cpds.setInitialPoolSize(5);
cpds.setMaxPoolSize(15);
ds = cpds;
} catch (PropertyVetoException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public static void main(String[] args) throws SQLException {
System.out.println(ds.getConnection());
}
}
ComboPooledDataSource类常用的方法:
DBUtils工具
DBUtils工具介绍:是由apache提供。是commons组件一员。是对jdbc简单的封装,减少操作数据库的代码。使用前,需要导入DBUtils的jar包。
QueryRunner类
QueryRunner类是DBUtils组件下的核心类,通常和ResultSetHandler接口配合使用,对jdbc代码进行了简单的封装,减少操作数据库大代码量。
ResultSetHandler接口
ResultSetHandler接口用于处理ResultSet结果集,它可以将结果集中的数据转为不同的形式。
ResultSetHandler提供了集中常见的实现类,具体如下: