JDBC连接池&DBUtils

来源:互联网 发布:刘德华 知乎 编辑:程序博客网 时间:2024/05/22 03:03

1、连接池
在程序开始的时候,可以创建几个连接,将连接放入到连接池中.用户使用连接的时候,可以从连接池中进行获取.用完之后,可以将连接归还连接池。
连接池的接口:javax.sql.DataSource

2、自定义连接池
MyConnection:

import java.sql.Array;import java.sql.Blob;import java.sql.CallableStatement;import java.sql.Clob;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.NClob;import java.sql.PreparedStatement;import java.sql.SQLClientInfoException;import java.sql.SQLException;import java.sql.SQLWarning;import java.sql.SQLXML;import java.sql.Savepoint;import java.sql.Statement;import java.sql.Struct;import java.util.LinkedList;import java.util.Map;import java.util.Properties;import java.util.concurrent.Executor;//1.实现同一个接口Connectionpublic class MyConnection implements Connection {    //3.定义一个变量    private Connection conn;    private LinkedList<Connection> pool;    // 2.编写一个构造方法(参数使用了面相对象的多态特性)    public MyConnection(Connection conn,LinkedList<Connection> pool) {        this.conn=conn;        this.pool=pool;    }    //4.书写需要增强的方法    @Override    public void close() throws SQLException {        pool.add(conn);    }    /**     * 此方法必须覆盖!否则会出现空指针异常!!!     */    @Override    public PreparedStatement prepareStatement(String sql) throws SQLException {        return conn.prepareStatement(sql);    }    //....省略其他}

MyDataSource

import java.io.PrintWriter;import java.sql.Connection;import java.sql.SQLException;import java.sql.SQLFeatureNotSupportedException;import java.util.LinkedList;import java.util.logging.Logger;import javax.sql.DataSource;import cn.itheima.jdbc.utils.JDBCUtils_V3;public class MyDataSource implements DataSource{    //1.创建1个容器用于存储Connection对象    private static LinkedList<Connection> pool = new LinkedList<Connection>();    //2.创建5个连接放到容器中去    static{        for (int i = 0; i < 5; i++) {            Connection conn = JDBCUtils_V3.getConnection();            //放入池子中connection对象已经经过改造了            MyConnection myconn = new MyConnection(conn, pool);            pool.add(myconn);        }    }    /**     * 重写获取连接的方法     */    @Override    public Connection getConnection() throws SQLException {        Connection conn = null;        //3.使用前先判断        if(pool.size()==0){            //4.池子里面没有,我们再创建一些            for (int i = 0; i < 5; i++) {                conn = JDBCUtils_V3.getConnection();                //放入池子中connection对象已经经过改造了                MyConnection myconn = new MyConnection(conn, pool);                pool.add(myconn);            }        }        //5.从池子里面获取一个连接对象Connection        conn = pool.remove(0);        return conn;    }    /**     * 归还连接对象到连接池中去     */    public void backConnection(Connection conn){        pool.add(conn);    }    //....省略其他}

使用

@Testpublic void testAddUser1() {    Connection conn = null;    PreparedStatement pstmt = null;    // 1.创建自定义连接池对象    DataSource dataSource = new MyDataSource();    try {        // 2.从池子中获取连接        conn = dataSource.getConnection();        String sql = "insert into tbl_user values(null,?,?)";        //3.必须在自定义的connection类中重写prepareStatement(sql)方法        pstmt = conn.prepareStatement(sql);        pstmt.setString(1, "吕布");        pstmt.setString(2, "貂蝉");        int rows = pstmt.executeUpdate();        if (rows > 0) {            System.out.println("添加成功!");        } else {            System.out.println("添加失败!");        }    } catch (Exception e) {        throw new RuntimeException(e);    } finally {        JDBCUtils_V3.release(conn, pstmt, null);    }}

3、C3P0连接池

http://www.mchange.com/projects/c3p0/
原创粉丝点击