DBCP开源数据库连接池的编写源码

 

DBCP开源数据库连接池的编写源码

一  思路分析

1. 使用数据库连接池的作用

如果没有数据库连接池,那么用户每次请求都需要向数据库获取连接,而数据库创建连接通常消耗相对较大的资源,创建时间也较长,可以造成内存溢出,所以就有了数据库连接池,为了避免总是访问数据库,因为数据库是很宝贵的资源。

2.编写的思路

  因为在每次访问数据库进行数据的增删改查的时候,都有相同的代码,所以把相同的代码提取出来,放到一个键值对的properties的文档中,通过反射的机制获取到文档的内容并加载到Porperty这样一个永久的属性类中,在资源的时候其实并没有真的的关闭,而是把数据放到数据库连接池中。

3.实现的类

实现java.sql.DataSource接口,接口中的方法getConnection()

4.实现的步骤:

(1)在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。

(2)实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。

(3)当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。

(4)Collection保证将自己返回到LinkedList中是此处编程的难点。

注:在接口构造函数中批量创建于数据库的连接,并把创建的连接加入到ListedList中,LinkedList在插入删除元素时对其他元素的影响很少,是链式的连接,而不是使用ArrayList         

二  代码分析

1.连接的实现 

public class DBManager {

    // 第一步:静态初始化块,加载配置文件

    private static DataSource ds = null;

    static {

       // 获取proerties中的信息

       InputStream is = DBManager.class.getClassLoader().getResourceAsStream("db.properties";

       // Properties 类表示了一个持久的属性集。

       Properties p = new Properties();

       try {

           // 从输入流中读取属性列表(键和元素对)。

           p.load(is);

           ds = BasicDataSourceFactory.createDataSource(p);

       } catch (Exception e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

 

    public static Connection getConnection() {

       Connection con = null;

       try {

           con = ds.getConnection();

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       return con;

    }

 

    // 是把资源归还到连接池中

    public static void release(Connection con, PreparedStatement st,

           ResultSet rs) {

       if (rs != null) {

           try {

              rs.close();

           } catch (Exception e) {

              e.printStackTrace();

           }

           rs = null;

       }

       if (con != null) {

           try {

              con.close();

           } catch (Exception e) {

              e.printStackTrace();

           }

           con = null;

       }

       if (st != null) {

           try {

              st.close();

           } catch (SQLException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

    }

2.测试

    public static void main(String[] args) {

       Connection con =null;

       PreparedStatement st = null;

       ResultSet rs = null;

      

       con = DBManager.getConnection();

       String sql="insert into t values(?)";

       try {

           st = con.prepareStatement(sql);

           st.setInt(1, 100);

           int  n = st.executeUpdate();

           if(n>0){

              System.out.println("插入成功");

           }

          

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }finally{

           DBManager.release(con, st, rs);

       }

    }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值