使用连接池后归还连接的方法,用户调用连接池的后,关闭资源close()方法,即为重写后的方法,这个方法为归还连接到连接池,
import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.LinkedList;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
//1.实现同一个接口Connection
public class MyConnection implements Connection{
//3。定义变量
private Connection conn;
private LinkedList<Connection> pool;
//2,编写构造方法(参数使用了面向对象的多态)
public MyConnection(Connection conn,LinkedList<Connection> pool) {
this.conn = conn;
this.pool = pool;
}
//4,书写需要增强的方法
public void close() throws SQLException {
pool.add(conn);
}
//必须覆盖 否则出现空指针异常
public PreparedStatement prepareStatement(String sql) throws SQLException {
return conn.prepareStatement(sql);
}
Connection接口不用的方法省略。。。。。
}
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.logging.Logger;
import javax.sql.DataSource;
import tools.JDBCUtils;
/**
* 自定义JDBC连接池
* 实现javax.sql.DataSource接口,使用getConnection()方法
* 创建LinkedList集合存放Connection对象 (因移除添加操作过多)
* 创建5个连接Connection对象放入集合中(直接调用JDBCUtils工具类)
* 在getConnection()方法中判断容器中是否有连接,没有在创建一些
* 从池子里获取一个连接对象,使用remove()方法
* 创建一个方法归还连接对象到池子中
*
*/
public class JdbcPoolZQ implements DataSource{
//创建LinkedList集合存放Connection对象
private static LinkedList<Connection> pool = new LinkedList<Connection>();
static {
//循环到容器中添加Connection对象
for (int i = 0; i < 5; i++) {
Connection conn = JDBCUtils.getConnection();
/*调用工具类JDBCUtils中的方法getConnection(),得到Connection对象添加到容器
* 放入池子中的对象经过改造的
*/
MyConnection myconn = new MyConnection(conn, pool);
pool.add(myconn);
}
}
public Connection getConnection() throws SQLException {
Connection conn = null;
//判断容器中是否有连接
if(pool.size() == 0) {
conn = JDBCUtils.getConnection();
//没有添加5个
for (int i = 0; i < 5; i++) {
MyConnection myconn = new MyConnection(conn, pool);
pool.add(myconn);
}
}
//获得Connection对象
conn = pool.remove(0);
return conn;
}
DataSource接口不用的方法省略。。。。。
}
测试方法
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.junit.Test;
import poolZQ.JdbcPoolZQ;
import tools.JDBCUtils;
public class TestPoolZQ {
/**
* 测试改造过的连接池
* @throws SQLException
*/
@Test
public void testJdbcPool() throws SQLException {
DataSource jp = new JdbcPoolZQ();
Connection conn = jp.getConnection();
String sql = "select * from student";
//调用的方法必须是connection类中重写后的方法
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getInt("id")+".."+rs.getString("name")+".."+
rs.getString("sex")+".."+rs.getString("score"));
}
//直接调用工具类的方法关闭资源
JDBCUtils.close(rs, ps, conn);
}
}