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

来源:互联网 发布:java ee ide 编辑:程序博客网 时间:2024/05/17 03:39
 

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);

       }

    }

 

原创粉丝点击