JavaWEB-(十一)Druid连接池

本文最后更新于:December 3, 2021 pm

Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。Druid连接池内置了WallFilter 提供防SQL注入功能,在不影响性能的同时防御SQL注入攻击。

目录

阿里巴巴Druid连接池开源项目地址

1.环境准备

下载 Druid jar包。并导入到项目中。

2.Druid连接池工具类

db.properties

⚠️特别提醒:username、password不能写成简写。必须写成这两个!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/WeekDay?serverTimezone=GMT%2B8
username=root # 必须写成username,不能写成user或者其他的
password=loong461 # 同上
# Druid连接池=======================================
# 初始化连接数量
initialSize=10
# 最大连接数量,当初始化的用完时,就继续新建
maxActive=30
# 最小空闲连接数量,即连初始化的都长时间没有用时,也会将其释放,直至最小空闲连接数量
minIdle=5
# 超时等待时间,以毫秒为单位。如果有超过最大连接数量的需求,则超过部分需要等待相应的时间,如果超了等待时间,就不会再等,即拿不到连接。
maxWait=5000

DbUtils.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package com.tothefor.OtherTest.Duid.Utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
* @Author DragonOne
* @Date 2021/8/14 23:33
*/
public class DbUtils {
//声明连接池对象
private static DruidDataSource dds;
static{
Properties properties = new Properties();
InputStream is = DbUtils.class.getResourceAsStream("/db.properties");
try {
properties.load(is);
//创建连接池
dds = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

public static Connection getConnection() {
try {
return dds.getConnection();//通过连接池获取连接对象
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void closeAll(Connection connection, Statement statement, ResultSet resultSet){
try {
if(resultSet != null){
resultSet.close();
}
if(statement != null){
statement.close();
}
if(connection != null){
connection.close();
}
}catch (SQLException e){
e.printStackTrace();
}
}
}

测试函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.tothefor.OtherTest.Duid.Utils.Test;

import com.tothefor.OtherTest.Duid.Utils.DbUtils;

import java.sql.Connection;
import java.sql.SQLException;

/**
* @Author DragonOne
* @Date 2021/8/14 23:49
*/
public class DbUtilsTest {
public static void main(String[] args) throws Exception {
for(int i = 1; i <= 15; ++i){
Connection connection = DbUtils.getConnection();
System.out.println(connection);
//放回连接池
connection.close();
}
}
}

//输出
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270
com.mysql.cj.jdbc.ConnectionImpl@fe18270

/**
这里的connection是一样的,因为取出后放回了连接池中,如果不放回(不要close()),则会有15个不同的connection。而且默认是10个,最高连接数为30。
*/

放回连接池处调用的close()并不是关闭,而是放回连接池。因为调用的close()是DruidPooledConnection实现类中的close()。