首页 > 技术文章 > 连接池介绍 + 示意图 + 手写连接池pool

yikuan-919 2018-08-22 20:10 原文

连接池:

  用来存放数据库连接的一个容器,这个容器在整个程序中共享。

  提高程序执行效率,降低与数据库的交互次数。

 

 

 

 

 

 

 

 

 

 

 

自定义连接池步骤:

  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);
        }    
    }
}

 

推荐阅读