当前位置: 代码迷 >> 综合 >> JDBC 09 数据库连接池 DBCP
  详细解决方案

JDBC 09 数据库连接池 DBCP

热度:2   发布时间:2023-11-24 13:08:30.0

2.5 数据库连接池


数据库连接 --> 执行完毕 --> 释放

这样的过程,如果频繁的去操作,其实也是非常低效率的!所以我们就诞生了一个 技术,叫做 "池化技术"

池化技术:提前准备一些预先的资源,然后过来就连接预先准备好的。

你可以想成一个现实生活中的事,比如说 银行给你处理业务,不可能 开门你进去然后专门给你一个人服务,完事后,你出去关门,下个人再来,这样的话 效率太低了。

那么我们一个银行里,最少需要多个服务人员呢?

也就是最小连接数:按照我们的需求来设定!

最大连接数: 业务最高承载上线(毕竟也不可能让那么多人一下子全进来。)

如果 处理业务时间过长,我们就可以 处理下一个人的业务了。(也就是所谓的等待超时!

等待超时:等待多久后,自动退出不再处理,将准备处理下一个。


2.6 编写连接池(只需要实现 DataSource)

开源数据源实现:

  • DBCP
  • C3P0
  • Druid:阿里巴巴

使用了这些数据库连接池后,我们就不需要在项目开发中编写连接数据库的代码了。

DBCP 需要的 jar 包

commons-dbcp2-2.9.0.jar commons-pool2-2.10.0.jar commons-logging-1.2.jar

在这里插入图片描述

  • 配置文件
#连接设置
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&charaterEncoding=utf8&useSSL=true&serverTimezone=UTC
username = root
password = 123123#!-- 初始化连接 --
initialSize=10#最大连接数量
maxActive=50#!-- 最大空闲连接 --
maxIdle=20#!-- 最小空闲连接 --
minIdle=5#!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60--
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:【属性名=property;】
#注意:user 与 password 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=UTF8#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
  • dbcp 工具类代码
package com.muquanyu.lesson03;import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class JdbcUtils_DBCP {
    private static DataSource  dataSource = new BasicDataSource();static {
    try {
    InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");Properties properties = new Properties();properties.load(in);//创建数据源 (工厂模式)--> 创建dataSource = BasicDataSourceFactory.createDataSource(properties);} catch (Exception e) {
    e.printStackTrace();}}//获取连接public static Connection getConnection() throws SQLException {
    return dataSource.getConnection();}//释放资源public static void release(Connection conn, Statement st, ResultSet rs) {
    if (rs != null) {
    try {
    rs.close();} catch (SQLException e) {
    e.printStackTrace();}}if (st != null) {
    try {
    st.close();} catch (SQLException e) {
    e.printStackTrace();}}if (conn != null) {
    try {
    conn.close();} catch (SQLException e) {
    e.printStackTrace();}}}
}
  • 测试代码
package com.muquanyu.lesson03;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class DBCPDemo {
    public static void main(String[] args) throws SQLException {
    Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {
    connection = JdbcUtils_DBCP.getConnection(); //获取到数据库对象statement = connection.createStatement(); // 获取到 SQL 执行对象String sql = "insert into `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)" +" values('4','罗翔','159159','159159@23.com','1985-8-1')";int num = statement.executeUpdate(sql);if (num > 0) {
    System.out.println("插入数据成功!");}} catch (SQLException e) {
    e.printStackTrace();}String sql = "select * from `users`";resultSet = statement.executeQuery(sql);while (resultSet.next()) {
    System.out.println(resultSet.getInt("id") + "|" + resultSet.getString("NAME")+ "|" + resultSet.getObject("PASSWORD") + "|" + resultSet.getString("email")+ "|" + resultSet.getDate("birthday"));}JdbcUtils_DBCP.release(connection, statement, resultSet);}
}

在这里插入图片描述

  相关解决方案