数据库连接池的简单实现

时间:2021-02-08 22:01:18

数据库连接池的简单实现

技术运用场景:数据库连接频繁,不需要反复开关闭连接

实现简单的连接池功能:简单概括

变量:

  • int 连接池最小空闲连接数
  • int 连接池最大空闲连接数
  • int 每次增加移除连接数

方法:
1. 连接池添加连接(内部用)
2. 取走一个连接(公开)
3. 关闭空闲的int个连接(公开)
4. 清空所有连接(生命周期结束使用)

最近业务遇到一个提数业务环节需要反复用到数据库连接操纵数据库,开关连接占据了很多时间,为解决此问题简单实现了一个连接池。分享代码抛砖引玉。

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

import com.sinosoft.utility.JdbcUrl;

/** * @Author: admin@dxscx.com * @Time: 2016-8-22 下午2:21:07 * @Notice: 提数阶段用的连接池 降低数据 * 库开关频率,让连接最大限度的存活在TS周期 * @Version: v1.0 */
public class TSConnPool {

    private static LinkedList<Connection> conns = new LinkedList<Connection>();
    private final static int MIN_CONNS_CONUT = 2;// 最小连接数,小于增加
    private final static int MAX_CONNS_CONUT = 10;// 最大连接数,大于则移除关闭
    private final static int UPDATE_PER = 3;// 连接的每次增加和删除个数

    /** * 内部使用,添加一个connection */
    private static void addConnection() {
        JdbcUrl jdbcUrl = new JdbcUrl();
        Connection conn = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(jdbcUrl.getJdbcUrl(),
                    jdbcUrl.getUserName(), jdbcUrl.getPassWord());
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("数据库连接失败");
        } catch (ClassNotFoundException e) {
            System.out.println("找不到数据库驱动");
            e.printStackTrace();
        }
        conns.push(conn);
    }

    /** * 最后使用,清除掉所有connections,关闭连接 */
    public static void clearConnection() {
        java.util.Iterator<Connection> it = conns.iterator();
        Connection conn = null;
        while (it.hasNext()) {
            conn = conns.pop();
            try {
                if (conn != null) {
                    System.out.println(conn + " connection closed");
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /** * 内部使用,当连接数超过某一数字时,关闭后count个连接空闲 */
    private static void closeLastConnection(int count) {
        if (conns.size() < count) {
            return;// 连接数小于想关闭的连接数,没有意义
        }
        Connection conn = null;
        for (int i = 0; i < count; i++) {
            conn = conns.removeLast();
            try {
                if (conn != null) {// 判断一下是否为空
                    System.out.println(conn + " connection closed");
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /** * 取走一个Connection用 * * @return */
    public static Connection getAConnection() {
        if (conns.size() < MIN_CONNS_CONUT) {// 小于最低连接数
            for (int i = 0; i < UPDATE_PER; i++) {
                addConnection();
            }
        }
        if (conns.size() > MAX_CONNS_CONUT) {// 大于最大连接数
            closeLastConnection(UPDATE_PER);// 关掉不用的连接
        }
        Connection conn = conns.pop();
        System.out.println("get a connection" + conn);
        return conn;
    }

    /** * 还回来一个Connection,将其放入连接池 * * @return */
    public static void closeAConnection(Connection conn) {
        System.out.println("return a connection" + conn);
        conns.push(conn);
    }

    /** * 临时测试 * * @param args */
    public static void main(String[] args) {
        TSConnPool.addConnection();
        TSConnPool.addConnection();
        TSConnPool.addConnection();
        System.out.println("last the size:" + conns.size());
        TSConnPool.clearConnection();
    }
}