自定义连接池(装饰者模式增强)

使用连接池后归还连接的方法,用户调用连接池的后,关闭资源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 pool;
	
	//2,编写构造方法(参数使用了面向对象的多态)
	public MyConnection(Connection conn,LinkedList 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 pool = new LinkedList();
	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);
	}
}

 

 

你可能感兴趣的:(自定义连接池(装饰者模式增强))