zoukankan      html  css  js  c++  java
  • 连接池介绍 + 示意图 + 手写连接池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);
            }    
        }
    }
  • 相关阅读:
    开放不应是唯一的价值观,互联网营销 狼人:
    什么是互联网产品的运营?,互联网营销 狼人:
    十年:邮箱,互联网营销 狼人:
    瘦客户端那些事 开篇,互联网营销 狼人:
    谈谈互动型网站中垃圾贴的应对方案,互联网营销 狼人:
    告诉你一个真实的中国互联网:精英与草根,互联网营销 狼人:
    从Google Wave和XML看软件复杂性之争,互联网营销 狼人:
    构建可伸缩高性能的互联网应用,互联网营销 狼人:
    注册接口使用StructureMap和Autofac等Ioc容器
    备份文件oracle 10g rman备份与恢复 之二
  • 原文地址:https://www.cnblogs.com/yikuan-919/p/9520104.html
Copyright © 2011-2022 走看看