数据库连接池的简单实现

数据库连接池的简单实现

技术运用场景:数据库连接频繁,不需要反复开关闭连接
实现简单的连接池功能:简单概括

变量:

  • 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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值