数据库链接池示实例

数据库连接池

为什么使用连接池

使用JDBC和数据库建立连接的方式

  • 建立连接
  • 执行对数据库的操作
  • 关闭连接
  • 回收资源

每次要访问数据库都要 先建立连接 执行操作 然后再 断开连接 回收资源 如果经常对数据库操作 则内存开销大

使用一次 连接一次

使用连接池和数据库建立连接

  • 创建连接池(只需要执行一次)
  • 从连接池获取连接
  • 执行对数据库的操作
  • 将连接放回连接池

Q:放回连接池后的连接还能被再次利用吗

A:可以,只要保证连接池中有空闲的连接就能和数据库建立连接

每次要对数据库进行操作时就从连接池中取出一个连接 操作完成之后放回 方便快捷

**按需要获取连接 从连接池中获取一个连接 用完再放回 **

使用连接池的好处

  • 提高资源的重用性(主要原理)

避免频繁的创建数据库连接,先创建多个联机放入连接池可以重复使用

  • 响应速度更快

不需要再从头建连接,直接从连接池中获取连接,减少了时间开销

  • 新的资源分配

可以直接在应用层管理连接池中的资源,使用JDBC的话则不能管理

  • 统一的资源管理

可以统一的对连接池中的链接进行管理,能设置连接个数还能设置超时断开时间

使用连接池本质上的多个数据库建立连接的重用,重用性得到提高其连接的响应速度会更快,连接的效率更高,也更加方便管理

连接池原理

建立连接池

  • 建立若干和数据库的连接
  • 将建立的联机放入容器中

对连接池的管理(核心)

  • 和线程相配合
  • 可以设置最大等待时间 到时间强制关闭连接 抛出异常
  • 建立连接先需要先判断是否达到了设定的最大值

Q:建立的连接数量能超过所设定的最大值吗?

A:可以超过,有上限并不说明一定不能超过这个数量

比如上限是5个连接当连接需求增多时可以增加到6个(超过了最大连接限制)

Q:为什么可以超过,能超过最多是多少

A:当需要更多的连接时如果不能及时的提供则会造成访问时间长,可以超过但不能无限度的超过比如不能超过上线的30%

连接池的关闭

  • 关闭连接池的时间是 整个程序退出时

连接池的配置

  • 主要的配置是minConn和maxConn用来限制连接池的数量
    • minxConn 是启动时要建立的连接数量
    • maxConn是 最大的建立的连接数量

Q:minConn应该设置多少?设置的过多或过少会怎样

A:设置的多-启动时慢-响应快

设置的少-启动快-但可能因为连接不足造成执行速度缓慢 需要自行寻找饱 和点 权衡驱动时间和响应

自定义数据库连接池

java 复制代码
package come.example.jdbc.chapter02;

import java.sql.Connection;

/**
 * @Classname TestMyConnectionPool
 * @Description 测试自定义连接池
 * @Author Jay lan
 * @Date 2023/9/12 20:21
 * @Version 1.0.0
 */
public class TestMyConnectionPool {
    public static void main(String[] args) {
        for (int i = 0; i < 6; i++) {
            try {
//                从连接池获取连接
                Connection connection=MyConnectionPool.getConnection();
//                使用获取到的链接
                System.out.println("获取到的第"+i+"个连接为:"+connection);
//                将连接放回连接池
                MyConnectionPool.releaseConnection(connection);


            }catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}
java 复制代码
package come.example.jdbc.chapter02;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.LinkedList;


/**
 * @Classname MyConnectionPool
 * @Description 自定义的数据库连接池
 * @Author Jay lan
 * @Date 2023/9/11 11:39
 * @Version 1.0.0
 */


public class MyConnectionPool {
    //    创建一个存储Connection兑现的List作为连接池
    private static final LinkedList<Connection> myPool = new LinkedList<Connection>();

    //    建立三个连接并放入连接池
    static {
        try {
            for (int i = 0; i < 3; i++) {
//                注册驱动
                Class.forName("com.mysql.cj.jdbc.Driver");
//                获取JDBC连接
                Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/chapter01","root","Xi233");
//                将连接放入连接池(存放Connection的List)
                myPool.add(connection);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @return Connection对象(连接)
     * @Description 从连接池中获取一个连接
     */
    public static Connection getConnection() {
//        removeFirst()从集合中移除第一个元素并将其返回
//        getFirst()则是取出第一个元素不将其从集合中移除
        return myPool.removeFirst();
    }

    /**
     * @param connection 要释放的连接
     * @Description 释放一个连接将放回连接池
     */
    public static void releaseConnection(Connection connection) {
        if (connection != null) {
            myPool.add(connection);
        }

    }

}

常用的连接池

  • CP30-开源
  • DBCP连接池-Apache组织,开源,适合服务器,独立的应用程序
  • Druid连接池-国产,阿里巴巴,开源
相关推荐
r i c k13 分钟前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦28 分钟前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL1 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·1 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德1 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫2 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i2 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.2 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn2 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露3 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot