自定义的C4P数据库连接池

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

 
  

public class C4p0 implements DataSource{
private List list = new ArrayList();
// 在创建时就创建多个连接对象
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 list;
    private Connection conn;
    public ConnectionWap() {
        // TODO Auto-generated constructor stub
    }
    public ConnectionWap(Connection conn,List 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数据库连接池)