• 数据库链接池示实例


    数据库连接池

    为什么使用连接池

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

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

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

    使用一次 连接一次

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

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

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

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

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

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

    使用连接池的好处

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

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

    • 响应速度更快

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

    • 新的资源分配

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

    • 统一的资源管理

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

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

    连接池原理

    建立连接池

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

    对连接池的管理(核心)

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

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

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

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

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

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

    连接池的关闭

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

    连接池的配置

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

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

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

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

    自定义数据库连接池

    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();
                }
            }
        }
    }
    
    
    • 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
    
    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);
            }
    
        }
    
    }
    
    
    
    • 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

    常用的连接池

    • CP30-开源
    • DBCP连接池-Apache组织,开源,适合服务器,独立的应用程序
    • Druid连接池-国产,阿里巴巴,开源
  • 相关阅读:
    Vue开发中的一些常见套路和技巧(上)
    动态SQL+分页
    Java 继承
    Microsoft 10/11 命令行打开系统设置页(WUAP,!WIN32)
    电子电器架构 --- 智能座舱技术分类
    调研:huggingface-diffusers
    Spring Framework 简介与起源
    Flink的部署模式:Local模式、Standalone模式、Flink On Yarn模式
    Java练习任务【15】
    JSON.stringify()的深入学习和理解
  • 原文地址:https://blog.csdn.net/qq_62822397/article/details/132889364