JDBC连接池(自定义)

使用连接池重写工具类

1、连接池由来

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

2、连接池概念

(1)、概念

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

(2)、规范

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

常见的连接池:DBCP、C3P0(使用占用最高80%)。

3、自定义连接池

  1. 创建连接池实现(数据源),并实现接口javax.sql.DataSource。因为我们只使用该接口中getConnection()方法,
  2. 提供一个集合,用于存放链接,因为移出/添加操作过多,所要选择LinkedList
  3. 在静态代码块中,为链接池添加几个连接。
  4. 之后程序如果需要连接,调用实现类的getConnection(),此方法将从连接池(容器List)中获取连接。为保证当前连接值只能提供一个线程使用,所以我们需要将连接从连接池中移出。
  5. 当用户使用完连接,释放资源时,不执行close()方法,热死讲连接添加到连接池中去。

代码实现:

连接池实现类:

public class MyDataSource implements DataSource{

	private static LinkedList<Connection> pool = new LinkedList<Connection>();
	
	//为连接池创建5个连接
	static {
		for(int i = 0; i<5; i++) {
			pool.add(JDBCutil.getConnection());
		}
	}
	
	//获取连接
	public Connection getConnection() throws SQLException {
		//如果连接池为空,添加连接
		if(pool.isEmpty()) {
			for(int i = 0; i<5; i++) {
				pool.add(JDBCutil.getConnection());
			}
		}
		
		return pool.remove(0);
	}
     //归还连接
	public void backConnection(Connection conn) {
		pool.add(conn);
	}
}

测试类:

public class Text {

	@Test
	public void Test() {
		PreparedStatement pstmt = null;
		ResultSet res = null;
		Connection conn = null;
		//创建连接池实现类
		MyDataSource mydata = new MyDataSource();
		//获得连接
		try {
			conn = mydata.getConnection();
			String sql = "select * from student";
			pstmt = conn.prepareStatement(sql);
			res = pstmt.executeQuery();
			while(res.next()){
				System.out.println(res.getString(1)+"\t"+res.getString(2)+"\t"+res.getString(3));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			mydata.backConnection(conn);
		}
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值