java通过dbcp实现一个数据库连接池

前言

对于spring项目,如果需要用到多数据源,可以直接在spirng配置多个数据源,但是这种方法比较麻烦,特别是项目整合了mybatis的情况,如果我们只需要很简单地访问另外一个数据库,我们完全可以通过dbcp实现一个简单的连接池即可。

实现

一开始,我们可以用纯粹的jdbc来连接数据库,但是这样,我们每次访问数据库,都需要开启连接和关闭连接,非常浪费资源,因此,我们可以实现一个简单的连接池,用于减少这部分资源的开销。并且,我们不需要自己实现连接池的功能,各大厂商都已经为我们提供了连接池的实现,例如C3P0DBCP连接池等,我们只需在这基础上二次开发即可,这里,我们选用DBCP来实现我们的连接池功能。

  • pom.xml配置
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>
  • config.properties配置连接属性
#other database
other.jdbc.driver=com.mysql.jdbc.Driver
other.jdbc.url=jdbc:mysql://localhost:3306/spring_test?useUnicode=true&characterEncoding=utf-8
other.jdbc.user=root
other.jdbc.password=root
other.initSize=1
other.maxAtive=8
other.maxWait=60000
other.maxIdle=6
other.minIdle=2
  • 连接池工具类

这里使用了ThreadLocal类,主要是通过该类实现同步效果,防止多线程下该连接池失效。

public class DbUtil {

    private static final Logger log = LoggerFactory.getLogger(DbUtil.class);

    /**
     *  数据库连接池
     */
    private static BasicDataSource dbcp;

    /**
     *  为不同线程管理连接
     */
    private static ThreadLocal<Connection> threadLocal;

    static {
        try {
            dbcp = new BasicDataSource();
            dbcp.setDriverClassName(PropertyUtil.getProperty("config", "other.jdbc.driver"));
            dbcp.setUrl(PropertyUtil.getProperty("config", "other.jdbc.url"));
            dbcp.setUsername(PropertyUtil.getProperty("config", "other.jdbc.user"));
            dbcp.setPassword(PropertyUtil.getProperty("config", "other.jdbc.password"));
            // 初始化
            dbcp.setInitialSize(Integer.parseInt(PropertyUtil.getProperty("config", "other.initSize")));
            // 最大连接数
            dbcp.setMaxActive(Integer.parseInt(PropertyUtil.getProperty("config", "other.maxAtive")));
            // 最大等待时间
            dbcp.setMaxWait(Long.parseLong(PropertyUtil.getProperty("config", "other.maxWait")));
            // 最大空闲数
            dbcp.setMaxIdle(Integer.parseInt(PropertyUtil.getProperty("config", "other.maxIdle")));
            // 最小空闲数
            dbcp.setMinIdle(Integer.parseInt(PropertyUtil.getProperty("config", "other.minIdle")));

            threadLocal = new ThreadLocal<>();

        } catch (Exception e) {
            log.error("DbUtil exception",e);
        }
    }

    /**
     * 获取一个连接
     * @return
     */
    public static Connection getConnection() {
        try {
            Connection connection = dbcp.getConnection();
            connection.setAutoCommit(false);
            threadLocal.set(connection);
            return connection;
        } catch (Exception e) {
            log.error("getConnection exception",e);
            return null;
        }
    }

    /**
     * 归还一个连接
     */
    public static void closeConnection() {
        try {
            Connection connection = threadLocal.get();
            if(connection != null) {
                // 实际上没有关闭连接,只是放在池子里
                connection.close();
                threadLocal.remove();
            }
        } catch (Exception e) {
            log.error("closeConnection exception",e);
        }

    }
}
  • 利用junit来进行测试
@Test
public void testDbUtil(){
    String sql = "select * from study_login";
    Connection connection = DbUtil.getConnection();
    try{
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()){
            System.out.println(resultSet.getInt(1));
            System.out.println(resultSet.getString(2));
            System.out.println(resultSet.getString(3));
        }
    }catch (Exception e){
        logger.error("testDbUtil exception", e);
    }


}

源码

详细代码请参考github的DbUtil.java

https://github.com/wumingzhizhu/springTest

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 前言 数据库连接池在Java数据库相关中间件产品群中,应该算是底层最基础的一类产品,作为企业应用开发必不可少的组件...
    许da广阅读 7,161评论 2 27
  • JDBC Java 数据库连接(Java Database Connectivity,简称JDBC)是 Java ...
    狗子渣渣阅读 1,942评论 0 10
  • 最原始的数据库连接就是我们打开一个连接,使用过后再关闭该链接来释放资源。频繁的新建打开再关闭连接对jvm和数据库都...
    野柳阅读 6,353评论 1 11
  • Java 为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自 己的连接池实...
    胜浩_ae28阅读 1,328评论 0 2
  • 在ios开发中,使用图片的方式有两种一种方式可以将图片散落在工程中,一种方式可以用bundle统一管理。 文件形式...
    mymdeep阅读 4,135评论 2 2