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);
            }    
        }
    }
  • 相关阅读:
    Notepad++ 文件丢失了,找回历史文件方法
    oracle数据库连接问题org.springframework.jdbc.support.MetaDataAccessException: JDBC DatabaseMetaData method not implemented by JDBC driver
    Windows下安装Oracle 11g 2版 64位,从下载,安装,测试连接成功~!
    Windows设置 .exe 开机自启动
    设置VMware 以及指定 虚拟机 ,开机自启动
    实体类与数据库字段不匹配问题,java.sql.SQLSyntaxErrorException: Unknown column 'xxx' in 'field list'
    springboot访问出错,mapperScan导包错误java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider.<init>() at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_172] at java.
    Google浏览器显示URL的 http https ....
    跑满带宽的一款百度网盘下载工具 : PanDownload
    免费使用Google
  • 原文地址:https://www.cnblogs.com/yikuan-919/p/9520104.html
Copyright © 2011-2022 走看看