数据库连接池简介

什么是数据库连接池

当系统使用JDBC技术访问数据库时会创建一个connection对象,而该对象的创建过程是非常消耗资源的,并且创建对象的时间也比较长,假设系统一天有1万次的访问量,那么一天就会创建1万connection对象,这极大的浪费数据库的资源,而且可能造成数据库服务器内存溢出、宕机。
为了解决上面的问题,就引入了数据库连接池(Connection pooling),它主要用来分配、管理、释放数据库的连接。数据库连接池首先会创建若干(该数量可以配置)个connection对象并将这些对象放入到池中,当系统需要使用connection对象时,数据库连接池会从池中分配一个事先创建好的connection对象给系统,当系统使用完毕或超时后,数据库连接池会将该connection对象重新放入到池中。这样就减少了创建connection对象所耗费的资源和时间,可以提高对数据库操作的性能。

数据库连接池

模拟编写一个数据库连接池

因为要用到数据库,所以需要将之前编写的JDBC相关的代码和jar包拷贝过来,创建一个SimpleConnectionPool类,里面需要实现下面三个功能:

  • 初始化一个数据库连接池并向里面添加10个数据库连接
  • 从连接池中获取连接
  • 当程序用完连接后,需要将该连接重新放入到连接池中

需要注意数据库连接池要保证线程安全

    package com.monkey1024.jdbc.pool;

    import java.sql.Connection;
    import java.util.Collections;
    import java.util.LinkedList;

    import com.monkey1024.jdbc.util.DBUtil;

    /**
     * 只是模拟编写数据库连接池,不能用于开发使用
     *
     */
    public class SimpleConnectionPool {

        // 创建一个存放连接的池子,需要保证线程安全。
        //因为LinkedList的添加和删除操作效率高,所以使用LinkedList作为连接池
        private static LinkedList<Connection> pool = (LinkedList<Connection>) Collections
                .synchronizedList(new LinkedList<Connection>());

        static {
            try {
                //向连接池中放10个连接
                for (int i = 0; i < 10; i++) {
                    //创建一个数据库连接
                    Connection conn = DBUtil.getConnection();
                    pool.add(conn);
                }
            } catch (Exception e) {
                throw new ExceptionInInitializerError("初始化数据库连接失败!");
            }
        }

        // 从连接池中获取一个连接
        public static Connection getConnectionFromPool() {
            Connection conn = null;
            if (pool.size() > 0) {
                //将连接池中的一个连接取出
                conn = pool.removeFirst();
                return conn;
            } else {
                // 此时说明连接池中已经没有空闲连接了,需要等待
                throw new RuntimeException("服务器忙。。。");
            }

        }

        // 当程序用完连接后,需要将该连接重新放入到连接池中
        public static void release(Connection conn) {
            pool.addLast(conn);
        }
    }

下面是DBUtil工具类,这个类想必大家应该比较熟悉了,配置文件这里就不写了:

package com.monkey1024.jdbc.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ResourceBundle;

public class DBUtil {

    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;

    static{
        ResourceBundle rb = ResourceBundle.getBundle("db");
        driverClass = rb.getString("driverClass");
        url = rb.getString("url");
        username = rb.getString("username");
        password = rb.getString("password");
        try {
            //注册驱动
            Class.forName(driverClass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url, username, password);
    }
}