要想自己写一个数据库连接池 需要实现DataSoure这个类,然后重写getConnection 这个方法


public class C4p0 implements DataSource{
private List<Connection> list = new ArrayList<Connection>();
// 在创建时就创建多个连接对象
public C4p0() {
for(int i=0;i<10;i++) {
list.add(JDBCUTil.getConnection());
}
}

@Override
public Connection getConnection() throws SQLException {

if(list.size()==0) {
// 在创建几个
for(int i=0;i<5;i++) {
list.add(JDBCUTil.getConnection());
}
}

// 从集合中拿走一个conn对象
Connection conn = list.remove(0);
ConnectionWap connection = new ConnectionWap(conn, list);
// 这里需要通过装饰者模式 来重新改造close方法
return connection;
}


// 在释放连接的时候 我们想要的是把conn连接对象归还于连接池 而不是关闭连接所以我们自己写一个Connection的实现类 通过装饰者模式,我们改造了close()方法
public class ConnectionWap implements Connection{
    private List<Connection> list;
    private Connection conn;
    public ConnectionWap() {
        // TODO Auto-generated constructor stub
    }
    public ConnectionWap(Connection conn,List<Connection> list) {
        this.conn = conn;
        this.list =list;
    }
    // 需要用到这个
    @Override
    public PreparedStatement prepareStatement(String sql) throws SQLException {
        System.out.println("用的是自己写的C4p0写的哦");
        return conn.prepareStatement(sql);
    }

    // 通过装饰者来装饰这个conn对象
    @Override
    public void close() throws SQLException {

        // 用完将conn送回集合
        list.add(conn);

    }
}

然后进行我们的正常操作

public static void main(String[] args) {

        C4p0 c4p0 = new C4p0();
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = c4p0.getConnection();
            String sql = "insert into stu values(3,'ls')";

            ps = conn.prepareStatement(sql);
            int cout = ps.executeUpdate();
            System.out.println(cout); // 插入成功
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {

            // 这里我们需要归还conn到连接池 而不是关闭连接 、
            JDBCUTil.close(ps, conn);
        }

    }
 

自定义的C4P数据库连接池的更多相关文章

  1. c#数据库连接池

    因为使用习惯的问题,我封装了一个数据库连接池Hikari,这是我自定义的数据库连接池.因为c#的连接池按照规范的ADO.NET里面实现定义的,由数据库官方提供,但是实现方式就不知道了,反正没有看出来, ...

  2. c#数据库连接池Hikari重构升级

    Hikari是我自定义的数据库连接池,前面已经提供了地址.因为c#的连接池按照规范的ADO.NET里面实现定义的.由数据库官方提供,但是实现方式就不知道了,反正没有看出来,估计一般是连接类实现的,但是 ...

  3. 【Java EE 学习 15】【自定义数据库连接池之动态代理的使用】

    一.动态代理的作用 使用动态代理可以拦截一个对象某个方法的执行,并执行自定义的方法,其本质是反射 优点:灵活 缺点:由于其本质是反射,所以执行速度相对要慢一些 二.数据库连接池设计思想 1.为什么要使 ...

  4. 数据库连接JDBC和数据库连接池C3P0自定义的java封装类

    数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...

  5. JDBC 学习笔记(三)—— 数据源(数据库连接池):DBCP数据源、C3P0 数据源以及自定义数据源技术

    本文目录:        1.应用程序直接获取连接的缺点(图解)        2.使用数据库连接池优化程序性能(图解)        3.可扩展增强某个类方法的功能的三种方式        4.自定 ...

  6. 【MySQL】自定义数据库连接池和开源数据库连接池的使用

    数据库连接池的概念 数据库连接背景 数据库连接是一种关键的.有限的.昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性 ...

  7. .数据库连接池技术:DBCP和C3P0

    数据库连接池技术:DBCP和C3P0 1.什么是数据库连接池 已知的方法是需要访问数据库的时候进行一次数据库的连接,对数据库操作完之后再释放这个连接,通常这样业务是缺点很明显的: 用户每次请求都需要向 ...

  8. 【Java EE 学习 16 上】【dbcp数据库连接池】【c3p0数据库连接池】

    一.回顾之前使用的动态代理的方式实现的数据库连接池: 代码: package day16.utils; import java.io.IOException; import java.lang.ref ...

  9. Log4j 配置数据库连接池(将日志信息保存到数据库)

    org.apache.log4j.jdbc.JDBCAppender 是利用传统的 JDBC 连接方法,这种方式连接数据库效率低下,为了解决这个问题,现在自定义一个 Log4j 的 Appender, ...

随机推荐

  1. Oracle shell监控小脚本

    cat dba_cpu_monitor.sh   ##CPU Monitorh=`hostname`cpu_used=`top -b -d 1 -n 2 | grep Cpu | awk 'NR> ...

  2. 【csp模拟赛6】相遇--LCA

    对于30%的数据:暴力枚举判断 对于60%的数据:还是暴力枚举,把两条路径都走一遍计一下数就行,出现一个点被访问两次即可判定重合 对于100%的数据:找出每条路径中距离根最近的点(lca),判断这个点 ...

  3. 外网可以反问lxr

    , 'baseurl_aliases' => 174       [ 'http://172.168.2.4/lxr' 175       , 'http://mydomain/lxr' 176 ...

  4. 调皮捣蛋的Linux下有趣终端的合集

    *本文作者:国光,转载自 FreeBuf.COM,原文地址:https://www.freebuf.com/news/144050.html 前言 刚开始接触Linux的我们,肯定认为Linux系统就 ...

  5. Jenkins修改显示语言为中文

    1 安装插件 主界面 -> 系统管理 -> 插件管理 -> 可选插件 1.1 安装插件Locale plugin 1.2 安装插件Localization: Chinese(Simp ...

  6. Qt for Android(一)Qt在Android手机上全屏显示

    1.在程序的编译路径下找到AndroidManifest.xml文件,具体路径如下: 2.在pro文件中添加一句话: ANDROID_PACKAGE_SOURCE_DIR = $$PWD/Androi ...

  7. Java ExecutorService四种线程池及自定义ThreadPoolExecutor机制

    一.Java 线程池 Java通过Executors提供四种线程池,分别为:1.newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收 ...

  8. Java 线程概述

    1 进程与线程基本概念 1.1 进程:执行中的程序 每个进程都有独立的代码和数据空间(进程上下文),进程空间切换会有较大的开销,一个进程包含1-n个线程.进程是资源分配的最小单位. 1.2 线程:进程 ...

  9. win10windows无法创建快捷方式 请检查磁盘

      这个是因为文件没有权限造成的   打开"我的电脑",菜单栏里选择"工具"-"文件夹选项"-"查看",把里面" ...

  10. Ubuntu 18.04系统下arm-linux-gcc交叉编译器安装

    Ubuntu 18.04系统: arm-linux-gcc 4.4.3版本. 安装arm-linux-gcc将压缩包arm-linux-gcc.tar.gz解压到arm-linux-gcc文件夹tar ...