JDBC连接池

1、分析

     实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况下我们采用连接池技术来共享连接Connection。

2、连接池概述

     2.1概念

           用池来管理Connection,这样可以重复使用Connection。有了池,所以我们不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

     2.2、规范

              Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池。

               常见的连接池:DBCP 、 C3P0

3、自定义连接池

     3.1、分析步骤

           (1)、创建连接池实现(数据源),并实现接口 javax.sql.DataSource 。因为我们只使用该接口中getConnection()方法,简化过程中,可以自己提供方法,不实现接口。

            (2)、提供一个集合,用于存放连接,因为移除/添加操作过多,所以选择LinkedList。

            (3)、在静态代码块中,为连接池初始化3个连接。

            (4)、之后程序如果需要连接,调用实现类getConnection(),本方法将从连接池(容器List)获得连接。为了保证当前连接只提供给一个线程使用,所以我们需要将连接先从池中移除。

             (5)、当用户使用完连接,释放资源时,不执行close()方法,而是将连接添加到连接池中。

     3.2、案例实现

              3.2.1、提供容器及初始化

//创建容器,用于存放连接Connection
private static LinkedList<Connection> pool = new LinkedList<Connection>();

//初始化连接池中的连接
static{
    try{
        //1、注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        for(int i = 0 ; i < 3 ; i++){
            //2、获得连接
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");
            //3、将连接添加到连接池中
            pool.add(conn);
        }
    }catch(Exception e){
        throws new RuntimeException(e);
    }
}

           3.2.2、获得连接

/**
 *获得连接,从连接池中获得连接
 *@return
 */
public static Connection getConnection(){
    try{
        //1、如果池中有连接
        if(!pool.isEmpty()){
            //2、每一个连接Connection,只能提供给当前一个线程使用,必须进行移除操作
            Connection conn = pool.removeFirst();
            //3、返回刚刚获得连接
            return conn;
        }
        //4、如果没有连接,等待100毫秒,然后继续
        Thread.sleep(100);
        return getConnection();
    }catch(Exception e){
        throw new RuntimeException(e);
    }
}

      3.2.3、 归还连接

/**
 *释放资源,当连接connection close 时,归还给连接池
 *@param conn
 *@param st
 *@param rs
 */
public static void release(Connection conn){
    try{
        if(conn != null){
           // conn.close();   //不是真的关闭
            pool.add(conn);   //将从连接池获得的连接归还给连接池
        }
    }catch(Exception e){
        
    }
}

     3.2.4、测试使用

                 为了体现连接池优势,我们采用多线程并发访问,使同一个连接在不同时段,被不同的线程使用。

public class TestCustomPool{
    public static void main(String[] args){
        //10个线程,依次连接池中获得连接
        for(int i = 0 ; i < 10 ; i++){
            new MyThread().start();
        }
    }
}




class MyThread extends Thread{
    public void run(){
        try{
            //1、获得连接
            Connection conn = JdbcUtils.getConnection();
            
            System.out.println("使用:" + conn + "," + Thread.currentThread());

            //2、释放资源
            JdbcUtils.release(conn);
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    };
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值