为什么要有连接池?
建立数据库连接是一种非常耗时、耗资源的行为,所以通过数据库预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接库中申请一个就行,使用完毕再归还到连接池中。
1、数据库连接池的作用
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
2、DBCP连接池
(1)使用
DBCP(DataBase Connection Pool)数据库连接池, 是Java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。
使用步骤
1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2.使用api
(2)代码演示
package com.DBCP;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Properties;
public class dbcp {
public static void main(String[] args) throws Exception {
//采用配置文件的方式
Properties properties = new Properties();
properties.load(new FileInputStream("src/dbcp.properties"));
//创建连接池
DataSource dataSource = new BasicDataSourceFactory().createDataSource(properties);
//获取连接对象
Connection connection = dataSource.getConnection();
String sql="insert into demo2 values(?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"王五");
preparedStatement.setInt(2,2000);
int i = preparedStatement.executeUpdate();
System.out.println(i);
}
}
配置文件
#连接基本设置
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytest1?serverTimezone=UTC
username=root
password=123456
#<!--扩展配置 了解-->
#初始化连接
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
3、C3P0连接池
(1)使用
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。
使用方法
1.导入jar包(c3p0-0.9.1.2.jar)
2.使用api
(2)DBCP和C3P0的区别
- dbcp没有自动回收空闲连接的功能
- c3p0有自动回收空闲连接功能
(3)代码演示
package com.C3P0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class c3p0 {
public static void main(String[] args) throws SQLException {
//c3p0使用配置文件的方式 也可以使用xml配置文件
//1.配置文件名是固定的c3p0.properties
//2.文件必须放在src下
//ComboPooledDataSource()中也可以传入参数 默认是第一配置 xml中可以传入第二配置名
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
Connection connection = comboPooledDataSource.getConnection();
String sql="select *from demo2";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String string = resultSet.getString(1);
int anInt = resultSet.getInt(2);
System.out.println(string + "==" + anInt);
}
}
}
配置文件
c3p0.driverClass=com.mysql.cj.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/mytest1?serverTimezone=UTC
c3p0.user=root
c3p0.password=123456
4、Druid连接池
(1)简述
DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池。
使用步骤
1.导入德鲁伊的jar包
2.调用api
(2)代码演示
package com.Druid;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class druid {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.load(new FileInputStream("src/druid.properties"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
Connection connection = dataSource.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("select *from demo2");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String string = resultSet.getString(1);
int anInt = resultSet.getInt(2);
System.out.println(string + "==" + anInt);
}
}
}
配置文件
#\u57FA\u672C\u914D\u7F6E
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytest1?serverTimezone=UTC
username=root
password=123456
#\u6269\u5C55\u914D\u7F6E
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
5、DBUtils
(1)概述
Commons DBUtils是Apache阻止提供的一个对JDBC进行简单封装的开源工具类库。
(2)使用步骤
1.导入jar包(commons-dbutils-1.4.jar)
2.创建一个queryrunner类
queryrunner作用:操作sql语句
构造方法:new QueryRunner(Datasource ds);
3.编写sql
4.执行sql
query(..):执行r操作
update(...):执行cud操作
(3)代码演示
package com.DBUtils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
public class dbutils {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
properties.load(new FileInputStream("src/druid.properties"));
DataSource dataSource = new DruidDataSourceFactory().createDataSource(properties);
QueryRunner queryRunner = new QueryRunner(dataSource);
String sql="select *from demo2 where money=?";
//将查询出的结果保存在User中 集合中
List<User> list = queryRunner.query(sql, new BeanListHandler<User>(User.class), 1000);
System.out.println(list);
}
}
package com.DBUtils;
public class User {
private String name;
private double money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", money=" + money +
'}';
}
}