要想自己写一个数据库连接池 需要实现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);
        }

    }
 

最新文章

  1. 指定eclipse启动使用的JVM
  2. MFC学习 修改窗口样式
  3. Tomcat server分端口部署web项目
  4. hadoop多次格式化后,导致datanode启动不了,怎么办?(伪分布式)
  5. Mac操作系统常用快捷键
  6. html5 input属性
  7. 魅蓝Note2跑分 MT6753性能究竟如何
  8. Jenkins学习之——(2)插件的安装
  9. Vijos1144小胖守皇宫【树形DP】
  10. linux基础 作业篇
  11. [HAOI 2008]糖果传递
  12. Python中set的功能介绍
  13. java常用工具(jps等)说明
  14. 从构建分布式秒杀系统聊聊Lock锁使用中的坑
  15. js中arguments详解
  16. Android Studio 签名 安全图片
  17. IDEA中的常用设置
  18. predict predict_proba区别的小例子
  19. mount 移动硬盘出现的各种小问题
  20. android studio 修改gradle引用本地文件

热门文章

  1. rxjs与vue
  2. C语言学习笔记10-结构体、枚举、联合体
  3. Spring注解驱动——组件注册系列
  4. Python动态展示遗传算法求解TSP旅行商问题(转载)
  5. postgresql interval 字段拼接
  6. qDebug() &lt;&lt; currentThreadId();
  7. JMeter-jp@gc - PerfMon Metrics Collector-CPU监控工具的配置及使用(win版本)
  8. BigDecimal的toString和toPlainString区别
  9. Java NIO学习笔记八 Pipe
  10. Spark中的CombineKey()详解