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、付费专栏及课程。

余额充值