自定义连接池
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; } }
以上是关于自定义连接池的主要内容,如果未能解决你的问题,请参考以下文章