Java个人总结——JDBC数据库连接池(一)

版权声明:以上所有博客均为冷漠的小猿所有,引用请注明出处 https://blog.csdn.net/lyf1997115/article/details/82533330

数据库连接池


  • 什么是数据库连接池:

    数据库连接池就是系统预先为客户准备好的数据库的连接集合,集合内有多个连接,每当用户请求连接时系统就给该用户发放一个连接,用户用完后再归还给系统。

  • 为什么要使用连接池:

    用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。

  • 如何创建一个数据库连接池:

    Java为连接池实现提供了一个规范(接口),规范的写法,我们需要实现DataSource接口,然后实现相应的方法即可。


一、自定义实现连接池

为了从本质上理解数据库连接池的实现原理,可以自定义实现一个连接池。

本连接池只是简单的实现了连接池的取得连接的功能,并为其添加了归还连接的方法,其他方法均未实现。

public class MyBdcp implements DataSource {
    //定义线程安全的数据库连接集合
    public static List<Connection> connList = Collections.synchronizedList(new ArrayList<>());

    public static String driver = "com.mysql.jdbc.Driver";
    public static String url = "jdbc:mysql://localhost:3306/emp";
    public static String userName = "root";
    public static String password = "root";

    static {
        //注册驱动
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //向集合内添加10个数据库连接
        try {
            Connection conn = null;
            for (int i = 0; i < 10; i++) {
                conn = DriverManager.getConnection(url, userName, password);
                connList.add(conn);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //取得一个连接,若池中没有连接了就返回一个null
    @Override
    public Connection getConnection() throws SQLException {
        Connection conn = null ;
        if (connList.size()>0) {
            conn = connList.remove(0) ;
            System.out.println("连接池中的连接数为:" + connList.size());
            return conn ;
        }
        return null;
    }
    //交还连接,并将其添加到池中
    public void result(Connection conn) {
        connList.add(conn) ;
    }
    //以下方法均为实现
    @Override
    public PrintWriter getLogWriter() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setLogWriter(PrintWriter out) throws SQLException {
        // TODO Auto-generated method stub

    }

    @Override
    public void setLoginTimeout(int seconds) throws SQLException {
        // TODO Auto-generated method stub

    }

    @Override
    public int getLoginTimeout() throws SQLException {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

}

猜你喜欢

转载自blog.csdn.net/lyf1997115/article/details/82533330