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、断开连接

案例1

点击查看代码,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);
        }
    }

    /**
     * 查询某一个老师
     */
    public Teacher findOneTeacher(Integer id) {

        return null;
    }

    /**
     * 查询某一列的数据:结果是一行一列
     */
    public String findTeacherName(Integer id) {

        return null;
    }
}
点击查看代码 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());

    }
}

posted @ 2022-08-22 22:32  QuickSilver  阅读(105)  评论(0)    收藏  举报