数据库连接池
1.概念: 一个容器(集合), 存放数据库连接的容器
当系统初始化好后, 容器被创建, 容器中会申请一些连接对象, 当用户来访问数据库时, 从容器中获取连接对象, 用户访问完成之后, 会将连接对象归还给容器
2. 好处:
- 节约资源
- 用户访问高效
3. 实现:
- 标准接口 -
DataSource
-> java.sql 包- 方法:
- 获取连接 ->
getConnection()
- 归还连接 ->
Connection.close()
- 接对象是从连接池中获取,那么调用close()
方法不会关闭连接,而是归还连接
- 获取连接 ->
- 由数据库厂商实现
- C3P0 -> 数据库连接池技术
- Druid -> 由阿里巴巴实现
- 方法:
4.C3P0的使用
- 步骤:
- 导入jar包(两个) 官网: http://mvnrepository.com/
- c3p0-x.x.x.jar && mchange-commons-java-x.x.x.jar
- mysql-connector-java-x.x.x.jar
- 定义配置文件:
- c3p0.properties || c3p0-config.xml
- 路径: src目录下
- 创建核心对象 - 数据库连接池对象
ComboPooledDataSource
- 获取连接:
getConnection([String name])
- 参数可指定配置名称
- 导入jar包(两个) 官网: http://mvnrepository.com/
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">Hhn004460</property>
<!-- 连接池参数 -->
<!-- 初始化申请连接数量 -->
<property name="initialPoolSize">5</property>
<!-- 最大连接数量 -->
<property name="maxPoolSize">10</property>
<!-- 连接超时ms -->
<property name="checkoutTimeout">3000</property>
</default-config>
<!-- 命名配置: 配置多个 -->
<named-config name="mysql">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">Hhn004460</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
public static void main(String[] args) {
//使用默认配置
DataSource ds = new ComboPooledDataSource();
Connection conn = null;
//指定名称配置 - 参数
DataSource dsMysql = new ComboPooledDataSource("mysql");
Connection connMysql = null;
//获取11个默认连接对象
for (int i = 1; i <= 11; i++)
{
try {
conn = ds.getConnection();
System.out.println(i+" : " +conn);
//第五次归还连接
if (i == 5){
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
System.out.println("==========指定名称对象获取==============");
//获取9个指定名称连接对象
for (int i = 1; i <= 9; i++) {
try {
connMysql = dsMysql.getConnection();
System.out.println(i+" : " +connMysql);
//第五次归还连接
if (i == 5){
connMysql.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
5.Druid的使用
- 步骤:
- 导入jar包-下载地址:https://github.com/alibaba/druid
- druid-x.x.x.jar
- mysql-connector-java-x.x.x.jar
- 定义配置文件:
- properties 文件
- 任意名称,放置任意目录
- 获取数据库连接池对象 -> 工厂类 :
DruidDataSourceFactory
- 获取连接 ->
getConnction();
- 导入jar包-下载地址:https://github.com/alibaba/druid
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC
username=root
password=Hhn004460
# 初始化
filters=statinitialSize=2
maxActive=10
maxWait=3000
timeBetweenEvictionRunsMillis=6000
minEvictableIdle
TimeMillis=30000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
public static void main(String[] args) {
//1.导入jar包 get
//2.定义配置文件 get
//3.加载配置文件
Properties pro = new Properties();
InputStream is = DruidTest.class.getClassLoader().getResourceAsStream("druid.properties"); try {
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接
Connection conn = ds.getConnection();
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
- 使用Druid定义工具类:
- 定义一个类 JDBCUtils
- 提供静态代码块加载配置文件, 初始化连接对象
- 提供方法:
- 获取连接的方法: 通过数据库连接池连接
- 释放资源
- 获取连接池的方法
Spring JDBC - JDBC Template
Spring 框架对的JDBC简单封装
提供了JdbcTemplate
对象简化JDBC的开发
- 步骤:
- 导入jar包(5个)
- 创建JdbcTemplate对象, 依赖于数据源DataSource
JdbcTemplate temlate = new JdbcRemplate(ds);
- 调用J
jdbcTemplate
的方法完成CRUD操作-
update();
-> 执行DML -
queryForMap();
-> 查询结果将结果集封装为map集合- 查询结果长度只能为1 (key 为字段, value 为 值)
-
queryForList();
-> 查询结果将结果集封装为list集合- 将每一条记录封装为Map集合,再将Map集合装载到List集合中
-
query()
; -> 查询结果,将结果封装为JavaBean对象- 参数 -> RowMapper : 一般使用BeanPropertyRowMapper实现类,完成数据到JavaBean自动封装
-
queryForObject();
-> 查询结果,将结果封装为对象- 一般用于聚合函数的查询
-
- BeanPropertyRowMapper:
new BeanPropertyRowMapper<类型>(类型.class);
- JdbcTemplate:
public static void main(String[] args) {
String sql = "UPDATE account SET balance = 3000 WHERE id = ?";
//2. 创建JdbcTemplate对象
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
//3.调用方法 i
nt count = template.update(sql,3);
System.out.println(count);
}