使用连接池重写工具类
1、连接池由来
实际开发中“获得连接”和“释放资源”是非常消耗系统资源的两个过程,为此解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。
2、连接池概念
(1)、概念
用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
(2)、规范
Java为数据库连接提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同的厂商的连接池!
常见的连接池:DBCP、C3P0(使用占用最高80%)。
3、自定义连接池
- 创建连接池实现(数据源),并实现接口javax.sql.DataSource。因为我们只使用该接口中getConnection()方法,
- 提供一个集合,用于存放链接,因为移出/添加操作过多,所要选择LinkedList
- 在静态代码块中,为链接池添加几个连接。
- 之后程序如果需要连接,调用实现类的getConnection(),此方法将从连接池(容器List)中获取连接。为保证当前连接值只能提供一个线程使用,所以我们需要将连接从连接池中移出。
- 当用户使用完连接,释放资源时,不执行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);
}
}
}