2022-08-20 第八组 卢睿 学习心得
数据库连接池
connection 是一种稀有资源,一个连接建立就创造了一个资源
jdbc 使用数据库连接池的必要性
在使用基于 web 程序的数据库连接
- 在主程序中建立连接
- 执行 SQL
- 断开连接
所有的 jdbc 连接通过 DriverManager.getConnection
用完的连接不要被垃圾回收,能够重复使用
池化思想
每次去初始化一个连接池,连接池中会有很多个连接等待被使用
使用完连接之后,不需要关闭连接,只需要把连接还回到连接池
还回到连接池的操作不需要我们手动控制
设置一些属性,最大等待时间
比较常见的数据库连接池
- C3P0:2 代数据库连接池,太老了
- DBCP:2 代数据库连接池,太老了
- Druid(德鲁伊)数据库连接池,最好用的连接池
整合了 C3P0 和 DBCP 各自的优点
加入了日志监控,可以监控 SQL 语句的执行情况 - Hikari(光),目前最快的连接池,spring boot 默认的连接池
必须有对应的属性文件
.properties
约定 > 配置 > 编码
德鲁伊数据库连接池
import org.junit.Test;
import java.io.IOException;
import java.util.Properties;
public class Ch01 {
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">test01</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> IOException, SQLException {
<span class="hljs-type">Properties</span> <span class="hljs-variable">properties</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Properties</span>();
properties.load(Ch01.class.getClassLoader().getResourceAsStream(<span class="hljs-string">"druid.properties"</span>));
<span class="hljs-type">DruidDataSource</span> <span class="hljs-variable">druidDataSource</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">DruidDataSource</span>();
druidDataSource.configFromPropety(properties);
System.out.println(druidDataSource.getConnection());
System.out.println(druidDataSource.getCreateCount());
}
}
配置文件
druid.url=jdbc:mysql://127.0.0.1:3306/jsoft?useUnicode=true&characterEncoding=utf8
druid.username=root
druid.password=123456
druid.driverName=com.mysql.jdbc.Driver
druid.initialSize=10
druid.maxActive=20
druid.maxWait=20
hikari 数据库连接池
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.junit.Test;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Properties;
public class Ch02 {
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">test01</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> IOException, SQLException {
<span class="hljs-type">Properties</span> <span class="hljs-variable">properties</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Properties</span>();
properties.load(Ch01.class.getClassLoader().getResourceAsStream(<span class="hljs-string">"hikari.properties"</span>));
<span class="hljs-type">HikariConfig</span> <span class="hljs-variable">hikariConfig</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">HikariConfig</span>(properties);
<span class="hljs-type">HikariDataSource</span> <span class="hljs-variable">hikariDataSource</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">HikariDataSource</span>(hikariConfig);
System.out.println(hikariDataSource.getConnection());
}
}
配置文件
jdbcUrl=jdbc:mysql://127.0.0.1:3306/jsoft?useUnicode=true&characterEncoding=utf8
username=root
password=123456
driverClassName=com.mysql.jdbc.Driver
获取连接
import com.jsoft.util.BaseDao;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
public class Ch03 {
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">test01</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">try</span> {
<span class="hljs-type">Connection</span> <span class="hljs-variable">connection</span> <span class="hljs-operator">=</span> BaseDao.DATA_SOURCE.getConnection();
} <span class="hljs-keyword">catch</span> (SQLException e) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">RuntimeException</span>(e);
}
}
}
DBUtils
需要引入一个 jar 包
import com.jsoft.morning.demo2.Teacher;
import com.jsoft.util.BaseDao;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;
import java.sql.SQLException;
import java.util.List;
public class Ch01 {
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">test03</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> SQLException {
<span class="hljs-type">QueryRunner</span> <span class="hljs-variable">runner</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">QueryRunner</span>(BaseDao.DATA_SOURCE);
<span class="hljs-type">int</span> <span class="hljs-variable">i</span> <span class="hljs-operator">=</span> runner.update(<span class="hljs-string">"update teacher set name = ? where id = ?"</span>, <span class="hljs-string">"mmm"</span>, <span class="hljs-number">6</span>);
System.out.println(i);
}
<span class="hljs-comment">/**
* 查询一个记录
*/</span>
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">test02</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> SQLException {
<span class="hljs-type">QueryRunner</span> <span class="hljs-variable">runner</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">QueryRunner</span>(BaseDao.DATA_SOURCE);
<span class="hljs-type">Teacher</span> <span class="hljs-variable">teacher</span> <span class="hljs-operator">=</span> runner.query(<span class="hljs-string">"select * from teacher where id = ?"</span>, <span class="hljs-keyword">new</span> <span class="hljs-title class_">BeanHandler</span><>(Teacher.class), <span class="hljs-number">1</span>);
System.out.println(teacher);
}
<span class="hljs-comment">/**
* 查询多个记录
* <span class="hljs-doctag">@throws</span> SQLException
*/</span>
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">test01</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> SQLException {
<span class="hljs-comment">// 要使用DBUtils使用的是一个类</span>
<span class="hljs-comment">// 传入的是一个数据源DataSource,不是一个Connection</span>
<span class="hljs-type">QueryRunner</span> <span class="hljs-variable">runner</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">QueryRunner</span>(BaseDao.DATA_SOURCE);
<span class="hljs-comment">// 查询多个记录</span>
List<Teacher> teachers = runner.query(<span class="hljs-string">"select * from teacher"</span>, <span class="hljs-keyword">new</span> <span class="hljs-title class_">BeanListHandler</span><>(Teacher.class));
System.out.println(teachers);
}
}