2022-08-20 数据库连接池

每次去初始化一个连接池,连接池中会有很多个连接等待被使用,使用完连接之后,不需要关闭连接,只需要把连接还回到连接池,还回到连接池的操作不需要我们手动控制。

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。

Why?我们为什么要使用它呢?

数据库连接是一种关键的有限的昂贵的资源,一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的性能低下。每次去初始化一个连接池,连接池中会有很多个连接等待被使用。使用完连接之后,不需要关闭连接,只需要把连接还回到连接池,还回到连接池的操作不需要我们手动控制。初始化连接池,10条连接,来了20个请求,10个请求就直接拿10条连接去办事。剩下的10个请求,再向服务器申请连接数。 连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率。

  • (1)C3P0,2代数据库连接池,太老了
  • (2)DBCP,2代数据库连接池,太老了
  • (3)Druid(德鲁伊)数据库连接池,最好用的连接池。

阿里巴巴开源平台上的一个数据库连接池实现,整合了C3P0和DBCP各自的优点,加入了日志监控,可以监控sql语句的执行情况。

  • (4)Hikari(光),目前最快的连接池。springboot默认的连接池。
    必须有对应的属性文件:.properties。约定 > 配置 > 编码

JDBC使用数据库连接的必要性:在使用基于web程序的数据库连接

1、在主程序中建立连接
2、执行SQL
3、断开连接

点击查看代码,TeacherDao类

package com.jsoft.morning.demo1;

import com.jsoft.util.BaseDao;

import javax.xml.transform.Result;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class TeacherDao extends BaseDao {

    public int saveTeacher(Teacher teacher) {

        Connection conn = null;
        PreparedStatement pstmt = null;
        String sql = "insert into teacher (name) values (?)";

        try {
            conn = DATA_SOURCE.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, teacher.getName());

            return pstmt.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            release(pstmt, null);
        }

    }

    public int updateTeacher(Teacher teacher) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        String sql = "update teacher set name = ? where id = ?";

        try {
            conn = DATA_SOURCE.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, teacher.getName());
            pstmt.setInt(2, teacher.getId());

            return pstmt.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            release(pstmt, null);
        }
    }

    public int deleteTeacher(Integer id) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        String sql = "delete from teacher where id = ?";

        try {
            conn = DATA_SOURCE.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, id);

            return pstmt.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            release(pstmt, null);
        }
    }

    public List<teacher> findAllTeacher() {

        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select id,name from teacher";

        List<teacher> teachers = new ArrayList<>(16);

        try {
            conn = DATA_SOURCE.getConnection();
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();

            while(rs.next()) {
                Teacher teacher = new Teacher(rs.getInt(1),rs.getString(2));
                teachers.add(teacher);
            }
            return teachers;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * &#x67E5;&#x8BE2;&#x67D0;&#x4E00;&#x4E2A;&#x8001;&#x5E08;
     */
    public Teacher findOneTeacher(Integer id) {

        return null;
    }

    /**
     * &#x67E5;&#x8BE2;&#x67D0;&#x4E00;&#x5217;&#x7684;&#x6570;&#x636E;&#xFF1A;&#x7ED3;&#x679C;&#x662F;&#x4E00;&#x884C;&#x4E00;&#x5217;
     */
    public String findTeacherName(Integer id) {

        return null;
    }
}
</teacher></teacher>

点击查看代码 Teacher类

package com.jsoft.morning.demo1;

public class Teacher {

    private Integer id;
    private String name;

    public Teacher() {
    }

    public Teacher(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

点击查看代码 Demo

package com.jsoft.morning.demo1;

import org.junit.Test;

public class Demo {

    @Test
    public void test01() {

        TeacherDao teacherDao = new TeacherDao();
        System.out.println(teacherDao.findAllTeacher());

    }
}

Original: https://www.cnblogs.com/YQuicksilver/p/16614416.html
Author: QuickSilver
Title: 2022-08-20 数据库连接池

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611103/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • EasyExcel导入导出excel工具类

    easyexcel依赖 com.alibaba easyexcel 1.1.2-beat1 工具类 package com.example.demo.files; import c…

    数据库 2023年6月11日
    0113
  • 第十五章 Spring动态代理开发

    创建原始对象 public class UserServiceImpl implements UserService{ @Override public void register…

    数据库 2023年6月14日
    0113
  • 绿色安装MySQL5.7版本—-配置my.ini文件注意事项

    简述绿色安装MySQL5.7版本以及配置my.ini文件注意事项 前言 由于前段时间电脑重装,虽然很多软件不在C盘,但是由于很多注册表以及关联文件被删除,很多软件还需要重新配置甚至…

    数据库 2023年6月16日
    0107
  • LeetCode 21. 合并两个有序链表

    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,…

    数据库 2023年6月11日
    0106
  • logstash写入文件慢的问题排查记录

    终于找到根本原因了!!!!! logstash部署到k8s集群内部的,当所在节点的CPU资源被其他应用抢占时,logstash的处理速度就会降低 问题现象 logstash从kaf…

    数据库 2023年6月9日
    092
  • 实战 | 线程池的几种自定义扩展

    下图为线程池的构造方法,我们可以自定义一些功能实现项目优化 1、预先启动核心线程 this.prestartAllCoreThreads();使用方式:自定义线程池的构造方法中调用…

    数据库 2023年6月6日
    094
  • Linux–>定时任务调度

    指定系统在某个时间执行特点的命令或程序。 任务调度分类: crontab 选项 常用选项 选项 说明 -e 编辑crontab定时任务 -l 查询crontab任务 -r 删除当前…

    数据库 2023年6月14日
    070
  • Consul 入门-运行

    HashiCorp Consul 是由 HashiCorp 公司开发的,它是一家专注于 DevOps 工具链的公司,旗下的明星级产品包括 Vagrant、Terraform、Vau…

    数据库 2023年6月6日
    080
  • SQL学习日记(一) 语法篇

    对象名 关键字 描述 表 table 存储数据的逻辑单元,以行和列存在,行是数据记录,列是(属性)字段 系统表(数据字典) 存放数据库相关信息的表 程序员只可查看,不可修改 约束 …

    数据库 2023年5月24日
    077
  • SQL Server的Descending Indexes降序索引

    SQL Server的Descending Indexes降序索引 1、建立测试环境 测试环境:SQL Server 2012 表结构如下 USE [test] GO CREATE…

    数据库 2023年6月9日
    090
  • MySQL – 日志

    WAL机制 Write-Ahead Logging,预写日志系统即当有数据更新请求的时候,先写日志,再改内存,等”有空”的时候再落磁盘(刷脏页)。WAL机制…

    数据库 2023年5月24日
    096
  • MySQL实战45讲之基础篇

    前言 本文主要记录学习 MySQL&#x5B9E;&#x6218;45&#x8BB2;&#x4E4B;&#x57FA;&#x7840…

    数据库 2023年5月24日
    0113
  • 用户后台管理

    User Management 这是通过SpringBoot完成的用户后台管理系统 一些解释说明也在代码里面, 源码及资源 会放在文末哦!!! – 这是效果图 大概就这…

    数据库 2023年6月16日
    0117
  • ajax与thymeleaf分别实现数据传输

    小杰笔记篇: 1:第一种:利用Model和thymeleaf引擎来完成: Controller层: html:引入引擎 第二种方式:ajax: 第一步:创建User实体类假装数据库…

    数据库 2023年6月6日
    095
  • IO流

    流的分类 按操作数据不同,分为字节流和字符流。 按数据流的流向分为输出流和输入流。 按流的角色分为节点流和包装流。 抽象基类 字节流 字符流 输入流 InputStreanm Re…

    数据库 2023年6月16日
    086
  • 生成随机数的若干种方法

    背景: 创建账户时我们需要配置初始随机密码,使用手机号注册时需要随机验证码,抽奖活动需要随机点名,俄罗斯方块游戏需要随机出形状。这些案例都在说明一个问题,随机数据很重要!而在 Sh…

    数据库 2023年6月14日
    073
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球