【JDBC】学习路径8-连接池

Posted on 2022-05-25 15:37  罗芭Remoo  阅读(32)  评论(0编辑  收藏  举报

为什么是连接池?

第一、受我们硬件资源的限制,我们的一些资源使用时有限制的比如我们的数据库 连接数和线程数。为了摆脱这些限制,我们就使用了池化技术来将这些资源限制在一定范围内。


第二、我们创建和销毁这些如数据库连接、线程等资源的时候是需要消耗一定的性 能和时间的,使用池化技术可以先初始化一定数量的连接或线程,当我们使用的时候从中取出我们需要的资源,用完后再放回去。避免频繁的创建和销毁。提升整体性能。当我们池中的资源被拿完后我们就需要等待资源释放会池中后再取用,这里就对池的大小和初始化策略要求很高,应该根据具体场景进行选型。

 

当然了,我们这一节自己创建的连接池只是最为简单的,功能很简单。

意义在于了解连接池的基本流程。

后面我们会使用dbcp和c3p0这两个连接池第三方插件。

 

开发一个大型网站,咱服务器需要与多个用户进行连接。

与此同时,getConnection()所需的时间相对来说是比较长的。

所以我们最好预先创建好Connection对象,需要的时候直接拿出来用就好。

那么预先创建好的Connection就放在我们的连接池里面。

连接池的容器是:ArrayList

 

我们在JDBCUtils中创建连接池,并且预先创建多个Connection对象。

第一章:创建对象池

设置一个静态代码块,在程序启动时便会自动运行。

静态代码块中创建5个Connection对象,放在conList中。

调用getConnection()方法,就会从对象池中拿出一个Connection()对象,然后返回出来。

如果对象池空了,则直接再创建一个从Connection对象,返回。

在下一章讲解如何归还Connection

import java.sql.*;
import java.util.ArrayList;

public class JDBCUtils {
    private static final String CURL = "jdbc:mysql://localhost:3306/jdbc_01?useUnicode=true&characterEncoding=UTF8";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "88888888";
    private static ArrayList<Connection> conList = new ArrayList<>();

    static {
        for (int i = 0 ; i<=5;i++){
            Connection con = createConnection();
            conList.add(con);
        }
    }

    public static Connection getConnection(){
        if (conList.isEmpty()==false){
            Connection con = conList.get(0);
            conList.remove(con);
            return con;
        }else
            return createConnection();
    }


    private static Connection createConnection(){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");

            return DriverManager.getConnection(CURL,USERNAME,PASSWORD);

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

    public static void close(Connection con, PreparedStatement pstmt, ResultSet rs){
        try {
            pstmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 

第二章:归还线程池

我们只需要修改一下close()方法,再使用完后直接将Connection对象给回conList即可。

public static void close(Connection con, PreparedStatement pstmt){
    try {
        pstmt.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    //归还连接至对象池.
    conList.add(con);

}