连接池介绍 + 示意图 + 手写连接池pool
连接池:
用来存放数据库连接的一个容器,这个容器在整个程序中共享。
提高程序执行效率,降低与数据库的交互次数。

自定义连接池步骤:
1. 创建一个MyPool类,实现DataSource接口;
2. 创建一个容器,用来存放数据库连接对象;(增删使用LinkedList 、查询使用ArrayList)
3. 在静态代码块中完成容器的初始化,(静态代码块是程序在加载是就先执行的!!!);
4. 提供getConnection方法,用来对外界获取数据库连接;
5. 提供returnConnection方法,用来把用完的连接返回给连接池中;
MyPool.java
package cn.yikuan.pool;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;
import javax.sql.DataSource;
import cn.tedu.util.JDBCUtils;
/**
* 这个类用来完成自定义连接池
* @author Administrator
*
*/
public class MyPool implements DataSource{
//2.创建容器,用来存放数据库连接对象
static List<Connection> pool = new LinkedList<Connection>(); //增删使用LinkedList
//static List<Connection> pool1 = new ArrayList<Connection>(); //查询使用ArrayList
static{
for(int i=0;i<3;i++){
//初始化池子大小,获取数据库连接,放3个连接
Connection conn = JDBCUtils.getConnection();
pool.add(conn);
}
}
@Override
public Connection getConnection() throws SQLException {
Connection conn = pool.remove(0);
System.out.println("连接被拿走一个,现在还剩"+pool.size()+"个");
return conn;
}
public void returnConnnection(Connection conn){
try {
if(conn!=null && !conn.isClosed()){
pool.add(conn);
System.out.println("连接已经还回,还剩"+pool.size()+"个");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return null;
}
}
TestPool.java
package cn.yikuan.test; /** * 这个类用来测试自定义连接池 */ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.junit.Test; import cn.tedu.pool.MyPool; import cn.tedu.util.JDBCUtils; public class TestPool { @Test public void hello(){ Connection conn = null; Statement st = null; ResultSet rs = null; MyPool pool = new MyPool(); //声明连接池对象 try { //1.注册驱动;//2.获取数据库连接 java.sql.Connection; //conn = JDBCUtils.getConnection(); /*从池子里获取连接*/ conn = pool.getConnection(); //3.获取传输器 st = conn.createStatement(); //4.执行sql String sql = "select * from user"; rs = st.executeQuery(sql); //5.遍历结果集 while(rs.next()){ String id = rs.getString(1); //String id = rs.getString("id"); String username = rs.getString(2); String password = rs.getString(3); System.out.println(id+username+password); } } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.close(rs, st, null); //把连接还回池中 pool.returnConnnection(conn); } } }

浙公网安备 33010602011771号