自定义连接池

  步骤:

    创建:

    如果想在类加载的时候就创建几个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;
    }
}
时间: 2024-07-31 14:26:39

自定义连接池的相关文章

自定义连接池(装饰者模式)

连接池概述: 管理数据库的连接, 作用: 提高项目的性能. 就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可. 所有的连接池必须实现一个接口 javax.sql.DataSource接口 获取连接方法: Connection getConnection() 归还连接的方法就是以前的释放资源的方法.调用connection.close(); 增强方法: 1.继承 2.装饰者模式(静态代理) 3.动态代理 装饰者模式: 使用步骤: 1.装饰者和被装饰者实现同一

JDBC自定义连接池

最近学习了JDBC的相关知识,写一下自定义连接池 一些说明: 本代码参考了部分别人的代码!!! JDBCCon类具体创建了连接: MyConnection类集成了Connection类用来管理连接与池,其中的close方法必须pool.add(): MyDataSource则是具体实现连接池. 具体步骤: 1.导mysql的jar包 2.配置db.propertites 1 driver = com.mysql.cj.jdbc.Driver 2 url = jdbc:mysql://localh

java自定义连接池

1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或"释放资源"是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Connection 用池来管理Connection,这样可以重复使用Connection,有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象,当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection

自定义连接池的问题及解决分析

1.1.1 自定义连接池的问题:1.1.1.1 使用接口的实现类完成的构造MyDataSource dataSource = new MyDataSource();这种写法不方便程序的扩展.1.1.1.2 额外提供了方法归还连接 // 归还连接: dataSource.addBack(conn); 这种方式增加使用连接池的用户的难度.1.1.2 自定义连接池的问题解决如果不提供自定义的方法就可以解决这个问题,但是连接要如何归还到连接池呢?1.1.2.1 解决分析的思路原来在Connection中

JAVA自定义连接池原理设计(一)

一,概述 本人认为在开发过程中,需要挑战更高的阶段和更优的代码,虽然在真正开发工作中,代码质量和按时交付项目功能相比总是无足轻重.但是个人认为开发是一条任重而道远的路.现在本人在网上找到一个自定义连接池的代码,分享给大家.无论是线程池还是db连接池,他们都有一个共同的特征:资源复用,在普通的场景中,我们使用一个连接,它的生命周期可能是这样的: 一个连接,从创建完毕到销毁,期间只被使用一次,当周期结束之后,另外的调用者仍然需要这个连接去做事,就要重复去经历这种生命周期.因为创建和销毁都是需要对应服

数据库连接池原理详解与自定义连接池实现

实现原理 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约.无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量.连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中. 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象.使

自定义连接池的问题解决代码实现

1.1.1 使用装饰者模式增强Connection中的close方法为了简化编程,提供一个模板类(模板类原封不动的将接口中的所有方法都实现,但是都没有增强).编写一个装饰类继承模板类.在装饰类中只需要增强某一个方法即可.1.1.1.1 代码实现1.1.1.2 测试代码l 改写连接池 public class MyDataSource implements DataSource { // 将一些连接存入到内存中,可以定义一个集合,用于存储连接对象. private List<Connection>

MySql数据库再学习——使用强化版的自定义连接池连接数据库

一:两个重点, 一是获取properties文件的路径,总结在注释里,我当时获取了好半天,总是找不到文件. 二是理清这几个class之间的联系,以及本次demo的思路逻辑关系:总的来说就是,在原有的driverManager获取的基础上——>创建一个池子(池子中存储若干个基础的Connection对象) ——>书写一个强化类实现Connection接口(强化的是close()方法)——>在主程序中调用的时候 调用的是从池子中取出来的,强化后的 Connection对象. dbUtil.c

JDBC连接与自定义线程池

版本1 1 package jdbc_utils; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 import org.junit.Test; 10 /** 11 * 获取Connection对象 12 * 方案一 :简单版,直