要想自己写一个数据库连接池 需要实现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. vue-ckeditor-word粘贴

    我司需要做一个需求,就是使用富文本编辑器时,不要以上传附件的形式上传图片,而是以复制粘贴的形式上传图片. 在网上找了一下,有一个插件支持这个功能. WordPaster 安装方式如下: 直接使用Wor ...

  2. Jumbled String (Kattis - jumbledstring)(思维题)

    Problem Recall that a subsequence of a string is any string obtained by removing some subset of char ...

  3. Irrlicht引擎剖析一

    代码风格:  1.接口以I开头,实现以C开头,保存数据的结构体以S开头  2.函数名以小写字母开头,变量以大字母开头  3.接口的公共函数,其参数大部分给了默认值  4.采用名字空间    名字空间i ...

  4. idea导入项目之后包位置报错

    解决办法:

  5. 六、grep与正则表达式 (文本过滤)

    一.正则表达式 正则表达式:Regual Expression, REGEXP.由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能:基本正则表达式:BRE ...

  6. 5.4.2 mapFile读写和索引

    5.4.2         mapFile (1)定义 MapFile即为排序后的SequeneceFile,将sequenceFile文件按照键值进行排序,并且提供索引实现快速检索. (2)索引 索 ...

  7. H264基础简介

    前言 H264是属于视频的编码层的标准格式,视频编码显然是为了压缩大小.我们看下一个完全没压缩的视频数据大小.假设视频是高清(1280 * 720),每秒30帧,也就是每秒的数据 1280 * 720 ...

  8. linux系统安装Memcache

    Linux系统安装memcached 首先要先安装libevent库. centos  下执行 yum install libevent libevent-devel 查看memcached 是否已经 ...

  9. Android-Handler消息机制实现原理)(转)

    Android-Handler消息机制实现原理   一.消息机制流程简介 在应用启动的时候,会执行程序的入口函数main(),main()里面会创建一个Looper对象,然后通过这个Looper对象开 ...

  10. go一个简单的爬虫(豆瓣)

    最近在学习go语言爬虫,写了个小demo package main import ( "fmt" "io/ioutil" "net/http" ...