文章目录
- 数据库连接池介绍
- c3p0、DBCP、Druid的使用
- c3p0
- dbcp
- druid
- 三大连接池的区别
- 自己实现一个数据库连接池
数据库连接池介绍
对于简单的数据库连接,在使用之前创建一个连接,在使用之后释放连接,当系统比较复杂时,频繁的进行资源的连接和释放时很消耗系统性能的;
数据库连接池:负责分配、管理和释放数据库的连接,它允许服务重复使用一个数据库既有的数据库连接,不需要重复连接;
连接池的优势:
- 资源复用;
- 更快的系统相应速度;
- 新的一种资源分配方式;
- 统一的连接管理,避免数据库连接泄露;
常用的数据库连接池:
- c3p0:简单易用,稳定好,但是并发高的时候响应比较慢;
- DBCP:Apache旗下的一个开源的数据库操作的工具类,依附于Commons中的子项目;
- Druid:阿里开源的一个数据库连接池,除了实现数据库连接池本身的功能,并且提供了强大的监控功能;
c3p0、DBCP、Druid的使用
pom.xml需要添加的配置
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.26</version>
<scope>compile</scope>
</dependency>
c3p0
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!--配置连接池mysql-->
<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test4</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 初始化连接数 -->
<property name="initialPoolSize">10</property>
<!--最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime">30</property>
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize">100</property>
<!-- 最小连接数 -->
<property name="minPoolSize">10</property>
</named-config>
<!--配置连接池mysql-->
<named-config name="online">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test4</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 初始化连接数 -->
<property name="initialPoolSize">10</property>
<!--最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime">30</property>
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize">100</property>
<!-- 最小连接数 -->
<property name="minPoolSize">10</property>
</named-config>
<!--线下数据库配置-->
<named-config name="offline">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test4</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 初始化连接数 -->
<property name="initialPoolSize">10</property>
<!--最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime">30</property>
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize">100</property>
<!-- 最小连接数 -->
<property name="minPoolSize">10</property>
</named-config>
</c3p0-config>
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @ClassName TestDemo5
* @Description c3p0
* @Author lzq
* @Date 2019/7/6 20:18
* @Version 1.0
**/
public class TestDemo5 {
public static void main(String[] args) {
ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
try {
Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement();
String sql = "select * from student";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int sid = resultSet.getInt("sid");
String sname = resultSet.getString("sname");
int sage = resultSet.getInt("sage");
String ssex = resultSet.getString("ssex");
System.out.println(sid+"\t"+sname+"\t"+sage+"\t"+ssex);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
dataSource.close();
}
}
}
dbcp
dpcp.properties
#驱动路径
driver=com.mysql.jdbc.Driver
#JDBC连接URL
url=jdbc:mysql://127.0.0.1:3306/test4
#账号
username=root
#密码
password=123456
#初始连接池大小
initPoolSize=10
#最大空闲时间
maxIdleTime=20
#最大连接池数
maxPoolSize=40
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @ClassName TestDemo6
* @Description dbcp
* @Author lzq
* @Date 2019/7/6 20:27
* @Version 1.0
**/
public class TestDemo6 {
public static void main(String[] args) {
BasicDataSource dataSource = new BasicDataSource();
Properties pro = new Properties();
try {
pro.load(TestDemo6.class.getClassLoader
().getResourceAsStream("dbcp.properties"));
dataSource.setDriverClassName(pro.getProperty("driver"));
dataSource.setUrl(pro.getProperty("url"));
dataSource.setUsername(pro.getProperty("username"));
dataSource.setPassword(pro.getProperty("password"));
//初始化连接数量
dataSource.setInitialSize(Integer.parseInt(pro.getProperty("initPoolSize")));
//配置连接等待超时时间
dataSource.setMaxWait(Long.parseLong(pro.getProperty("maxIdleTime")));
//最大并发连接数
dataSource.setMaxActive(Integer.parseInt(pro.getProperty("maxPoolSize")));
Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement();
String sql = "select * from student";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int sid = resultSet.getInt("sid");
String sname = resultSet.getString("sname");
int sage = resultSet.getInt("sage");
String ssex = resultSet.getString("ssex");
System.out.println(sid+"\t"+sname+"\t"+sage+"\t"+ssex);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
dataSource.close();
dataSource.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
druid
druid.properties
#驱动路径
driver=com.mysql.jdbc.Driver
#JDBC连接URL
url=jdbc:mysql://127.0.0.1:3306/test4
#账号
username=root
#密码
password=123456
#初始连接池大小
initPoolSize=10
#最大空闲时间
maxIdleTime=20
#最大连接池数
maxPoolSize=40
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @ClassName TestDemo7
* @Description druid
* @Author lzq
* @Date 2019/7/6 20:27
* @Version 1.0
**/
public class TestDemo7 {
public static void main(String[] args) throws IOException, SQLException {
DruidDataSource dataSource = new DruidDataSource();
//读取配置信息
Properties pro = new Properties();
pro.load(TestDemo7.class.getClassLoader
().getResourceAsStream("druid.properties"));
dataSource.setDriverClassName(pro.getProperty("driver"));
dataSource.setUrl(pro.getProperty("url"));
dataSource.setUsername(pro.getProperty("username"));
dataSource.setPassword(pro.getProperty("password"));
//初始化连接数量
dataSource.setInitialSize(Integer.parseInt(pro.getProperty("initPoolSize")));
//配置连接等待超时时间
dataSource.setMaxWait(Long.parseLong(pro.getProperty("maxIdleTime")));
//最大并发连接数
dataSource.setMaxActive(Integer.parseInt(pro.getProperty("maxPoolSize")));
Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement();
String sql = "select * from student";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int sid = resultSet.getInt("sid");
String sname = resultSet.getString("sname");
int sage = resultSet.getInt("sage");
String ssex = resultSet.getString("ssex");
System.out.println(sid+"\t"+sname+"\t"+sage+"\t"+ssex);
}
dataSource.close();
}
}