一、什么是连接池
连接池是应用程序与数据库之间的一个缓冲区,它存储了一定数量的空闲数据库连接,当应用程序需要连接数据库时,可以从连接池中获取一个可用连接,使用完毕后再将连接归还给连接池,从而避免了每次连接都需要创建和销毁连接的开销,提高了应用程序的性能和可伸缩性。连接池也可以控制数据库连接的数量和复用,从而减少了数据库的负担。
简单理解的话就是将连接放到自己家抽屉里,需要用的时候就去拿,不用了就放回去,减少了连接的时间,不用去远处去拿。
二、连接池的好处
连接池的好处可以总结为以下几点:
1. 提高性能
数据库连接是资源密集型操作,每次建立连接都需要进行TCP握手,验证用户身份等操作。连接池缓存了一定数量的已经建立的连接,可以更快速地获取和释放连接,减少了连接建立和关闭的时间,提高了应用程序的性能。
2. 稳定性
当并发量较高时,如果每个请求都建立一个新的数据库连接,可能会导致数据库服务器过载。使用连接池可以控制连接的数量,避免过多的连接导致数据库服务器崩溃。
3. 节省资源
使用连接池可以重复利用已有的数据库连接,避免了频繁创建和关闭连接的开销,从而节省了资源。
4. 提高可靠性
连接池可以监控数据库连接的状态,并在连接出现问题时自动重置连接。这对于保持应用程序的可靠性和稳定性非常重要。
有四种连接池c3p0、driuid、HikariCP、DBCP
三、导入jar包
因为所有导入jar包步骤都是一致的,所以单拎出来写
因为需要测试连接池连接数据库是否成功,我们这里使用的是MySql
MySql.jar包:https://dev.mysql.com/downloads/connector/j/
下载MySqljar包


导入jar包
将下载好的jar包复制到项目中,建议大家建一个文件专门用来放置jar包。

复制进去就是这样,接下来添加为库
添加为库
右击jar包添加为库

根据需求选择级别之后直接确定

所有jar包都是这样导入。
四、c3p0连接池
下载jar包
C3P0jar包:
https://sourceforge.net/projects/c3p0/

创建配置文件
创建c3p0-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!--默认配置--> <default-config> <!--数据库驱动--> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <!--数据库的url--> <property name="jdbcUrl">jdbc:mysql://localhost:3306/vehicleUpkeepDB</property> <!--用户名写自己的--> <property name="user">root</property> <!--密码写自己的--> <property name="password">sasa</property> <!--初始连接数--> <property name="initialPoolSize">10</property> <!--最大连接数--> <property name="maxPoolSize">100</property> <!--最小连接数--> <property name="minPoolSize">10</property> </default-config> </c3p0-config>
|
测试连接
1 2 3 4 5 6 7 8 9 10 11 12 13
| ComboPooledDataSource dataSource = new ComboPooledDataSource();
Connection connection = dataSource.getConnection();
ResultSet resultSet = connection.prepareStatement("select count(0) from user ").executeQuery();
if(resultSet.next()){ System.out.println(resultSet.getInt(1)); }
resultSet.close(); connection.close();
|
结果
会有很多事务的东西,需要手动去关闭

这样就是连接成功了!
五、driuid连接池
下载jar包
driuid.jar包:https://repo1.maven.org/maven2/com/alibaba/druid/1.2.0/

导入项目,所有步骤都是一样的,不会就看上面c3p0
创建配置文件
创建driuid.properties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # 驱动名称(连接Mysql) driverClassName = com.mysql.cj.jdbc.Driver # 参数?rewriteBatchedStatements=True表示支持批处理机制 url = jdbc:mysql://localhost:3306/cinemaDB?useServerPrepStmts=true # 用户名,注意这里是按"userName"来读取的 userName = root # 用户密码(自己改) password = sasa # 初始化连接数量 initialSize = 10 # 最小连接数量 minIdle = 10 # 最大连接数量 maxActive = 50 # 超时时间5000ms (在等待队列中的最长等待时间,若超时,) maxWait = 5000
|
测试连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Properties properties = new Properties(); properties.load(Files.newInputStream(Paths.get("src\\driuid.properties")));
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
Connection connection = dataSource.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("select count(0) from user ");
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next()){ System.out.println(resultSet.getInt(1)); }
resultSet.close(); connection.close();
|
结果

这样就是连接成功了!
六、HikariCP连接池
HikariCP需要下载三个jar包
HiariCP.jar包:https://repo1.maven.org/maven2/com/zaxxer/HikariCP/4.0.3/
slf4j.jar包:https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/
log4j12.jar包:https://repo1.maven.org/maven2/org/slf4j/slf4j-log4j12/1.7.25/
下载jar包
三个jar包都是找到**.jar**的后缀

创建配置文件
创建HikariCP.properties
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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| # 驱动参数 jdbcUrl=jdbc:mysql://localhost:3306/vehicleUpkeepDB?characterEncoding=utf8&serverTimezone=GMT%2B8 #驱动名称(连接MySql) DriverClassName = com.mysql.cj.jdbc.Driver #账号 username=root #密码 password=sasa 上面的都是必须要的,下面都有默认参数一般不用配置
#常用的参数 # 从池中借出的连接是否默认自动提交事务 # 默认 true autoCommit=true
# 当我从池中借出连接时,愿意等待多长时间。如果超时,将抛出 SQLException # 默认 30000 ms,最小值 250 ms。支持 JMX 动态修改 connectionTimeout=30000
# 一个连接在池里闲置多久时会被抛弃 # 当 minimumIdle < maximumPoolSize 才生效 # 默认值 600000 ms,最小值为 10000 ms,0表示禁用该功能。支持 JMX 动态修改 idleTimeout=600000
# 多久检查一次连接的活性 # 检查时会先把连接从池中拿出来(空闲的话),然后调用isValid()或执行connectionTestQuery来校验活性,如果通过校验,则放回池里。 # 默认 0 (不启用),最小值为 30000 ms,必须小于 maxLifetime。支持 JMX 动态修改 keepaliveTime=0
# 当一个连接存活了足够久,HikariCP 将会在它空闲时把它抛弃 # 默认 1800000 ms,最小值为 30000 ms,0 表示禁用该功能。支持 JMX 动态修改 maxLifetime=1800000
# 用来检查连接活性的 sql,要求是一个查询语句,常用select 'x' # 如果驱动支持 JDBC4.0,建议不设置,这时默认会调用 Connection.isValid() 来检查,该方式会更高效一些 # 默认为空 # connectionTestQuery=
# 池中至少要有多少空闲连接。 # 当空闲连接 < minimumIdle,总连接 < maximumPoolSize 时,将新增连接 # 默认等于 maximumPoolSize。支持 JMX 动态修改 minimumIdle=5
# 池中最多容纳多少连接(包括空闲的和在用的) # 默认为 10。支持 JMX 动态修改 maximumPoolSize=10
# 用于记录连接池各项指标的 MetricRegistry 实现类 # 默认为空,只能通过代码设置 # metricRegistry=
# 用于报告连接池健康状态的 HealthCheckRegistry 实现类 # 默认为空,只能通过代码设置 # healthCheckRegistry=
# 连接池名称。 # 默认自动生成 poolName=zzsCP
#少用的参数 # 如果启动连接池时不能成功初始化连接,是否快速失败 TODO # >0 时,会尝试获取连接。如果获取时间超过指定时长,不会开启连接池,并抛出异常 # =0 时,会尝试获取并验证连接。如果获取成功但验证失败则不开启池,但是如果获取失败还是会开启池 # <0 时,不管是否获取或校验成功都会开启池。 # 默认为 1 initializationFailTimeout=1
# 是否在事务中隔离 HikariCP 自己的查询。 # autoCommit 为 false 时才生效 # 默认 false isolateInternalQueries=false
# 是否允许通过 JMX 挂起和恢复连接池 # 默认为 false allowPoolSuspension=false
# 当连接从池中取出时是否设置为只读 # 默认值 false readOnly=false
# 是否开启 JMX # 默认 false registerMbeans=true
# 数据库 catalog # 默认由驱动决定 # catalog=
# 在每个连接创建后、放入池前,需要执行的初始化语句 # 如果执行失败,该连接会被丢弃 # 默认为空 # connectionInitSql=
# JDBC 驱动使用的 Driver 实现类 # 一般根据 jdbcUrl 判断就行,报错说找不到驱动时才需要加 # 默认为空 # driverClassName=
# 连接的默认事务隔离级别 # 默认值为空,由驱动决定 # transactionIsolation=
# 校验连接活性允许的超时时间 # 默认 5000 ms,最小值为 250 ms,要求小于 connectionTimeout。支持 JMX 动态修改 validationTimeout=5000
# 连接对象可以被借出多久 # 默认 0(不开启),最小允许值为 2000 ms。支持 JMX 动态修改 leakDetectionThreshold=0
# 直接指定 DataSource 实例,而不是通过 dataSourceClassName 来反射构造 # 默认为空,只能通过代码设置 # dataSource=
# 数据库 schema # 默认由驱动决定 # schema=
# 指定连接池获取线程的 ThreadFactory 实例 # 默认为空,只能通过代码设置 # threadFactory=
# 指定连接池开启定时任务的 ScheduledExecutorService 实例(建议设置setRemoveOnCancelPolicy(true)) # 默认为空,只能通过代码设置 # scheduledExecutor=
# JNDI 配置的数据源名 # 默认为空 # dataSourceJndiName=null
|
测试连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| HikariConfig hikariConfig = new HikariConfig("src\\HikariCP.properties");
HikariDataSource ds = new HikariDataSource(hikariConfig);
Connection conn = ds.getConnection();
ResultSet rs = conn.prepareStatement("select count(*) from user").executeQuery();
while (rs.next()) { System.out.println(rs.getInt(1)); }
conn.close(); rs.close();
|
结果

这样就是连接成功了!
七、DBCP连接池
DBCP需要下载两个jar包
DBCP.jar包:https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
pool.jar包:https://commons.apache.org/proper/commons-pool/download_pool.cgi
下载jar包
两个都是这个位置

配置文件
创建DBCP.properties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #数据库连接地址 #url=jdbc:mysql://localhost:3306/数据库名(?配置参数) url=jdbc:mysql://localhost:3306/vehicleUpkeepDB?useUnicode=true&characterEncoding=utf-8 #数据库驱动类的全名 #driverClassName=com.mysql.jdbc.Driver #数据库帐号 username=root #数据库密码 等于号后面直接填密码,不需要引号,密码为空时可以不填或 "" password=sasa #初始化连接池时,创建的连接数量 initialSize=5 #连接池的最大连接容量,连接使用完后不释放会很容易达到最大值,导致之后的连接被卡住 maxActive=20 #空闲时允许保留的最大连接数量 maxIdle=5 #空闲时允许保留的最小连接数量 minIdle=5 #排队等候的超时时间(毫秒) maxWait=3000
|
测试连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| InputStream is = DBCP_Demo.class.getClassLoader().getResourceAsStream("DBCP.properties");
Properties ppt = new Properties(); ppt.load(is);
DataSource ds = BasicDataSourceFactory.createDataSource(ppt);
Connection con = ds.getConnection();
PreparedStatement ps = con.prepareStatement("select count(*) from user");
ResultSet re = ps.executeQuery();
if(re.next()){ int anInt = re.getInt(1); System.out.println(anInt); }
re.close(); ps.close(); con.close();
|
结果:

可能遇到的问题
NoClassDefFoundError 错误
1
| Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class lesson04.utils.JDBCUtils_DBCP
|
原因:DBCP2之后的版本需要 logging 包
官网下载:https://commons.apache.org/proper/commons-logging/download_logging.cgi
按照上面的步骤导入 IDEA 中即可