概述
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接是一个有限的,昂贵的资源,目前操作时一次数据库操作需要进行一次数据库连接以及关闭,造成大量时间的浪费。
为了解决以上问题,创建一个连接池,将与数据库的连接放入池子中。当使用的时候,从连接池中获取一个连接,当不使用的时候,将连接放入池子中,如果连接池中连接使用完,使用的连接数是否达到连接池的最大连接数,如果没有,会自动生成连接,如果是,则需要等待。当存在长时间闲置连接时进行回收。
常用的连接池
c3p0,dbcp,druid(阿里)
c3p0连接池
c3p0 - JDBC3 Connection and Statement Pooling
1.下载并导包
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.11.jar
2.创建c3p0配置文件(src下)
方式1->创建c3p0.properties的文件,文件名必须为c3p0
c3p0.driverClass=com.mysql.cj.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql:///demo?useSSL=false&serverTimezone=UTC
//用户
c3p0.user=root
//密码
c3p0.password=root
//最大连接数
c3p0.maxPoolSize=50
方式2->创建c3p0-config.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<!-- 必须添加的参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///demo?useSSL=false&serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">root</property>
</default-config>
</c3p0-config>
创建连接池对象
ComboPooledDataSource ds = new ComboPooledDataSource();
从连接池获取连接
Connection con = ds.getConnection();
生成SQL语句生成器
PreparedStatement ps = con.prepareStatement(sql);
DML操作或者DQL操作
int n = ps.executeUpdate();
ResultSet rs = ps.executeQuery();
将连接放回连接池
con.close();
dbcp连接池
1.下载jar包
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.2.jar
commmons-logging-1.1.1.jar
2.在项目中src下创建一个以.properties为后缀的文件
username=root
password=root
url=jdbc:mysql:///demo?useSSL=false&serverTimezone=UTC
driverClassName=com.mysql.cj.jdbc.Driver
initialSize=5
maxIdle=10
minIdle=5
maxWaitMillis=180
部分代码
//1.创建连接池对象
BasicDataSource ds = BasicDataSourceFactory.createDataSource(p);
//2.获取连接
Connection con = ds.getConnection();
String sql="select * from emp";
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
//遍历结果集
while(rs.next()) {
System.out.println(rs.getString("empno")+" "+rs.getString("ename")+" "+rs.getDate("hiredate"));
}
//3.将连接放回连接池
con.close();
DBUtils工具
Apache Commons DbUtils 1.7 API
DBUtils简化了JDBC的开发步骤,使得我们可以用更少量的代码实现连接数据库的功能。
Commmons DbUtils的核心是两个类一个接口:
1.DBUtils类:主要为关闭连接。装载JDBC驱动程序之类的常规工作方法,都是静态的方法。
2.QueryRunner类:为我们提供了两个重要的方法,调用方法之前需要先创建一个QueryRunner的对象。
//结合c3p0连接池完成
QueryRunner qr = new QueryRunner(new ComboPooledDataSource());
qr.update(); 支持DML操作
qr.query(); 支持DQL操作
两个方法都有多个重载,可以根据需求选择不同的重载方法。
ResultSetHandler 接口 将ResultSet中的数据转变为JavaBean对象
JavaBean是一个用于封装数据的类,在与数据库连接之中,JavaBean其的作用是将获取的数据库的记录封装到JavaBean中。
特性如下:
需要实现接口:java.io.Serializable ,可以省略不写。
提供私有字段:private 类型 字段名;
提供getter/setter方法:
提供无参构造
实现类:
1.BeanHandler 当单行查询的时候使用,映射一个javaBean对象
2.BeanListHandler 当多行查询的时候使用,映射成一个List集合对象
3.ScalarHandler 当聚合查询的时候使用,将一个列映射成一个对象Object|Number|Long
代码的演示示例:
package com.ujiuye.demo;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Before;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.ujiuye.javaBean.Emp;
public class DbUtisDemo {
QueryRunner qr = null;
@Before
public void start() {
qr = new QueryRunner(new ComboPooledDataSource());
}
// 添加操作
@Test
public void add() throws SQLException {
String sql = "insert into emp(empno,ename,job,hiredate,sal)values(?,?,?,?,?)";
Object[] params = { "8899", "金毛狮王", "光明顶护法", new Date(), 2345 };
int n = qr.update(sql, params);
System.out.println(n);
}
// 修改操作
@Test
public void update() throws SQLException {
String sql = "update emp set job=? where empno=?";
int n = qr.update(sql, "明教教主", "8899");
System.out.println(n);
}
// 删除操作
@Test
public void del() throws SQLException {
String sql = "delete from emp where empno=?";
int n = qr.update(sql,"8899");
System.out.println(n);
}
//单行查询
@Test
public void queryOne() throws SQLException {
String sql="select * from emp where empno=?";
Emp e = qr.query(sql, new BeanHandler<Emp>(Emp.class), "9999");
System.out.println(e);
}
//多行查询
@Test
public void queryMany() throws SQLException {
String sql="select * from emp";
List<Emp> list = qr.query(sql, new BeanListHandler<Emp>(Emp.class));
System.out.println(list);
}
//聚合查询
@Test
public void queryCount() throws SQLException {
String sql="select count(*) from emp";
Number num = qr.query(sql, new ScalarHandler<Number>());
System.out.println(num);
}
}