java基础之自定义连接池

java基础之自定义连接池

当我们对后台数据库进行多次增删改查时,会频繁的调用数据库,会使数据库的工作量加大,而如果定义一个连接池,让访问数据库的程序直接调用连接池里已经准备好了连接,下面就是一个简单地自定义的连接池的实现:

package com.softeem.test.demo01;

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

/**
 * @Authour: QWL
 * @Description:
 * @Daete: Created in 2020/12/11 17:33
 * @Modified by:
 */
public class MyDataSource {
    LinkedList<Connection> list = new LinkedList();
    /**
     * 驱动类路径
     */
    private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
    /**
     * URL地址
     */
    private static final String URL = "jdbc:mysql://localhost:3306/test5";
    /**
     * 登录数据库的账号
     */
    private static final String USER = "root";
    /**
     * 登录数据库的密码
     */
    private static final String PASSWORD = "123456";

    //初始连接数
    int initSize = 1;
    //最大连接数
    int maxSize = 15;
    //被激活的连接数
    int activeSize = 0;
    //闲置连接数
    int idelSize = 0;
    //设置最长的等待时间
    int MaxWait = 5000;

    //加载驱动
    static {
        try {
            Class.forName(DRIVER_CLASS);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //构造器
    public MyDataSource() {
    }

    //添加连接
    public void addConnection() {
            if (idelSize + activeSize >= maxSize) {
                System.out.println("当前连接池全部被占用");
                return;
            }
            try {
                list.add(DriverManager.getConnection(URL, USER, PASSWORD));
                idelSize++;
            } catch (SQLException e) {
                e.printStackTrace();
            }


    }
    //等待时间
    //TODO

    //获取连接
    public Connection getConnection() {
        if (list.size() <= 0) {
            addConnection();
        }

        Connection conn = list.remove();
        try {
            if (conn != null || conn.isClosed()) {
                //被激活
                activeSize++;
                //闲置数
                idelSize--;
                return conn;
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    //归还连接
    public void release(Connection conn) {
        try {
            if (conn != null && !conn.isClosed()) {
                //归还到池中
                list.add(conn);
                //闲置数增加
                idelSize++;
                //被激活数减少
                activeSize--;
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        //创建一个连接池对象
        MyDataSource myDataSource = new MyDataSource();
        System.out.println("空闲连接数 :" + myDataSource.idelSize);
        System.out.println("激活连接数据:" + myDataSource.activeSize);
        Connection conn = myDataSource.getConnection();
        //获取连接
        System.out.println(myDataSource.getConnection());
        System.out.println(myDataSource.getConnection());
        System.out.println(myDataSource.getConnection());
        System.out.println(myDataSource.getConnection());
        System.out.println(myDataSource.getConnection());
        System.out.println(myDataSource.getConnection());
        System.out.println(myDataSource.getConnection());
        System.out.println(myDataSource.getConnection());
        System.out.println(myDataSource.getConnection());
        System.out.println(myDataSource.getConnection());
//        System.out.println(conn);

        System.out.println("空闲连接数 :" + myDataSource.idelSize);
        System.out.println("激活连接数据:" + myDataSource.activeSize);
    }
}


请求一个新的 Connection 对象会带来大量的开销和很多潜在的错误。为了最小化开销同时减少数据库的压力可以准备好连接,当使用完成后就归还,类似扫码的单车一样,但是可能会使数据库开启时产生较大的等待时间,但是会减少程序运行时的消耗。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值