自定义连接池

Posted 这里是hsn的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义连接池相关的知识,希望对你有一定的参考价值。

自定义连接池
  步骤:
    创建:
    如果想在类加载的时候就创建几个Connection,就需要用到静态代码块
    创建Connection之后要找一个容器来存放,所以用到了集合
    因为存取操作多,所以选择了,存取快查找慢的LinkedList集合
    将固定数量的Connection加入到LinkedList集合中
 
    获取:
    写一个方法叫做getConnection,用来获取Connection
    在方法中,如果要取一个Connection,首先要判断容器里是否还有Connection
    所以用到了LinkedList的方法isEmpty来判断
    如果是空的,那就再创建两个
    然后return一个Connection对象,因为存在LinkedList中,要先将集合中的元素移出,所以用remove方法
    而remove方法返回的正是被移出的元素,所以直接返回pool.removeFirst();
 
    回收:
    回收一个对象,其实就是将这个对象重新加入到之前创建的pool中
    所以传入一个要回收的对象,然后通过add加入集合中就好了
 
 
通过看结果就知道,使用的都是类加载的时候,静态代码块中创建的元素。

源码

package day28_03;

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

import day28_02.JdbcUtil;

public class MyDataSource {
    private static LinkedList<Connection> pool = new LinkedList<>();
    static {
        for (int i = 0; i < 3; i++) {
            try {
                pool.addLast(JdbcUtil.getConnection());
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取连接
     * 
     * @return
     */
    public Connection getConnection() {
        // 判断是否还有空闲连接
        if (pool.isEmpty()) {
            // 没有连接就在创建两个连接
            for (int i = 0; i < 3; i++) {
                try {
                    pool.addLast(JdbcUtil.getConnection());
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

        // 有连接就返回一个连接
        return pool.removeFirst();
    }

    /**
     * 回收连接
     */
    public void addBack(Connection conn) {
        pool.addLast(conn);
    }
}
package day28_03;

import java.sql.Connection;

import org.junit.Test;

public class Demo {

    @Test
    public void demo() {
        MyDataSource ms = new MyDataSource();
        Connection conn = ms.getConnection();
        System.out.println(conn);
        ms.addBack(conn);
        conn = ms.getConnection();
        System.out.println(conn);
        ms.addBack(conn);
        conn = ms.getConnection();
        System.out.println(conn);
        ms.addBack(conn);
        conn = ms.getConnection();
        System.out.println(conn);
        ms.addBack(conn);
        conn = ms.getConnection();
        System.out.println(conn);
        ms.addBack(conn);
        conn = ms.getConnection();
        System.out.println(conn);
        ms.addBack(conn);
        conn = ms.getConnection();
        System.out.println(conn);
        ms.addBack(conn);

    }
}
package day28_02;

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

public class JdbcUtil {
    static final String CLASSDRIVER;
    static final String URL;
    static final String NAME;
    static final String PASSWORD;

    static {
        ResourceBundle rb = ResourceBundle.getBundle("Config");

        CLASSDRIVER = rb.getString("classDriver");
        URL = rb.getString("url");
        NAME = rb.getString("name");
        PASSWORD = rb.getString("password");
        try {
            Class.forName(CLASSDRIVER);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {

        
        return DriverManager.getConnection(URL, NAME, PASSWORD);

        
    }

    public static void closeResource(Connection conn, Statement stmt, ResultSet rs) {
        closeResult(rs);
        closeStatement(stmt);
        closeConnection(conn);
    }

    private static void closeConnection(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        conn = null;
    }

    private static void closeStatement(Statement stmt) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        stmt = null;

    }

    private static void closeResult(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        rs = null;
    }
}

 

以上是关于自定义连接池的主要内容,如果未能解决你的问题,请参考以下文章

JAVA自定义连接池原理设计

自定义连接池

自定义数据库连接池

自定义数据库连接池实现方式 MySQL

java自定义连接池

自定义连接池