数据库连接池简介
在未引入数据库连接池时中使用连接都创建一个Connection对象,使用完毕就会将其销毁。这样重复创建销毁的 过程是特别耗费计算机的性能的及消耗时间的
但数据库连接池是个容器,负责分配、管理数据库连接(Connection) 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
Driud连接池
思路:
- 导入jar包 druid-1.2.23.jar
- 定义配置文件
- 加载配置文件
- 获取数据库连接池对象
- 获取连接
代码实现:
配置文件(解决硬编码问题):
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql:///s_t?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
注意:等号左边字段必须是指定值,因在Druid的源码中已经指定相应的值
druid代码如下
package druid;
import cn.hutool.db.DbUtil;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.jupiter.api.Test;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;
public class DruidDemo {
@Test
public void test01() throws SQLException {
//创建连接池对象
DruidDataSource ds=new DruidDataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql:///s_t?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai");
ds.setUsername("root");
ds.setPassword("root");
String sql = "select * from sc";
// 这里使用 国产的hutool工具包中的DbUtil,快速操作数据库
List<Account> accounts = DbUtil.use(ds).query(sql, Account.class);
for (Account account : accounts) {
System.out.println(account);
}
}
@Test
public void test02() throws Exception {
//解决硬编码问题
Properties properties = new Properties();
InputStream is=DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(is);
//利用DruidDataSourceFactory 创建连接池
DataSource ds = DruidDataSourceFactory.createDataSource(properties);
String sql ="select * from sc where sno=?";
//创建连接池对象
// 这里使用 国产的hutool工具包中的DbUtil,快速操作数据库
List<Account> accounts = DbUtil.use(ds).query(sql, Account.class,"0811101");
//注:Account为自己自定义类型 主要用于限制数据的输出形式,必须有getXXX,setXXX方法
for (Account account : accounts) {
System.out.println(account);
}
}
}
HikariCP连接池
HikariCP 是一个高度优化且易于使用的 JDBC 连接池,适用于各种规模的应用程序。由于其出色的性能表现,它已成为许多 Java 开发者的首选连接池解决方案。
配置文件:
# 数据库连接配置
jdbcUrl=jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&useServerPrepStmts=true
username=root
password=1234
# 连接池大小
maximumPoolSize=10
minimumIdle=5
# 连接超时时间
connectionTimeout=30000
# 最大空闲时间
idleTimeout=600000
HikariCP代码如下:
// 注意:在导入HikariCP的jar时,因为底层依赖slf4j日志包,也必须导入,否则运行报错
public class HikariCPDemo {
@Test
public void test1(){
// 创建配置对象
HikariConfig config = new HikariConfig();
// 设置连接池配置
config.setJdbcUrl("jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&useServerPrepStmts=true");
config.setUsername("root");
config.setPassword("1234");
// 设置连接池的最大大小
config.setMaximumPoolSize(10);
// 创建数据源
HikariDataSource ds = new HikariDataSource(config);
// 使用数据源获取连接
try {
String sql = "select * from account";
// 这里使用 国产的hutool工具包中的DbUtil,快速操作数据库
List<Account> accounts = DbUtil.use(ds).query(sql, Account.class);
for (Account account : accounts) {
System.out.println(account);
}
}catch (Exception e){
e.printStackTrace();
}
}
@Test
public void test2() throws IOException {
// 创建配置对象
Properties prop = new Properties();
// 加载外部文件
InputStream in = HikariCPDemo.class.getResourceAsStream("/hikaricp.properties");
prop.load(in);
HikariConfig config=new HikariConfig(prop);
HikariDataSource ds = new HikariDataSource(config);
// 使用数据源获取连接
try {
String sql = "select * from account";
// 这里使用 国产的hutool工具包中的DbUtil,快速操作数据库
List<Account> accounts = DbUtil.use(ds).query(sql, Account.class);
for (Account account : accounts) {
System.out.println(account);
}
}catch (Exception e){
e.printStackTrace();
}
}
}