Java-JDBC连接池

来源:互联网 发布:2333软件登录不了 编辑:程序博客网 时间:2024/06/11 17:46

1.使用连接池改造JDBC

传统的JDBC操作,对连接池的对象的销毁不是特别好,每次创建和销毁连接都是需要花费时间,可以使用连接池优化程序。
在程序开始的时候,可以创建几个连接,将连接放入到连接池,用户使用连接的时候,可以从连接池中进行获取,用完之后将连接归还连接池。

1.1自定义连接池

【接口】datasource。

getConenction()
getCOnnection(String userName,String Password)

//  创建一个list集合用于存放多个连接对象    private List<Connection> list = new ArrayList<>();    public void MysqlDataSource() {        for (int i = 0; i < 3; i++) {            Connection connection = jdbcUtils.getConnection();            list.add(connection);        }    }    @Override    public Connection getConnection() throws SQLException {        if (list.size() <= 0) {            for (int i = 1; i < 3; i++) {                Connection connection = jdbcUtils.getConnection();                list.add(connection);            }        }        Connection connection = list.remove(0);        return connection;    }//  归还连接    public void addBack(Connection connection) {        list.add(connection);    }

测试:

@Test    public void test01() throws Exception{        Connection connection = null;        PreparedStatement preparedStatement = null;        ResultSet resultSet = null;        DataSourceDemo dataSourceDemo = new DataSourceDemo();        try {//          获得连接//          DataSourceDemo dataSourceDemo = new DataSourceDemo();            connection = dataSourceDemo.getConnection();            String sql = "select * from user";            preparedStatement = (PreparedStatement) connection.prepareStatement(sql);            resultSet = (ResultSet) preparedStatement.executeQuery();            while(resultSet.next()){                System.out.println(resultSet.getInt("cid")+"\t"+resultSet.getString("cname"));            }        } catch (Exception e) {            // TODO: handle exception            e.printStackTrace();        }finally {            try {                resultSet.close();                preparedStatement.close();                dataSourceDemo.addBack(connection);            } catch (Exception e2) {                // TODO: handle exception            }        }    }

1.2自定义连接池中问题及如何解决

1.如果使用自定义连接池,那么需要额外记住自定义连接池的API
2.能不能使用面向接口的方法
3.解决方法:
3.1增强一个JAVA类中的某个方法有几种方法
*第一种方法:继承 — 能够控制这个类的构造的时候,才可以使用继承
第二种方法:装饰者方式 — 包装对象和被包装对象都要实现相同的接口;包装的对象中需要获得到被包装对象的引用。
缺点:如果接口的方法比较多,增强其中的某个方法,其他的功能的方法需要有调用。
第三种方法:动态代理 — 被增强的对象实现接口就可以。
*

1.3继承和装饰者模式

【继承的方式】

/*继承的方法增强一个类中的摸个方法*/public class enhanceDemo01 {    @Test    public void test01(){        Superman superman = new Superman();        superman.run();    }}class Man{    public void run(){        System.out.println("run...");    }}class Superman extends Man{    @Override    public void run() {        super.run();        System.out.println("fly...");    }}

【装饰者的方式】

/*装饰者的方法增强一个类中的摸个方法*/interface Waiter{    public void server();}class Waiteress implements Waiter{    @Override    public void server() {        // TODO Auto-generated method stub        System.out.println("service");    }}class WaiteressWrapper implements Waiter{     private Waiter waiter;    public WaiteressWrapper(Waiter waiter) {        // TODO Auto-generated constructor stub         this.waiter = waiter;    }    @Override    public void server() {        // TODO Auto-generated method stub        System.out.println("smile");        this.waiter.server();    }}public class enhanceDemo01 {        @Test    public void test02(){        Waiter waiter = new Waiteress();        Waiter waiterWrapper =  new WaiteressWrapper(waiter);        waiterWrapper.server();    }}

1.4装饰者模式增强Connection的Class方法

private Connection connection;    private List<Connection> list;     public MyConnection(Connection connection,List<Connection> list) {        // TODO Auto-generated constructor stub        this.connection = connection;        this.list = list;    }    @Override    public void close() throws SQLException {        // TODO Auto-generated method stub        list.add(connection);    }

连接池的getConnection()方法

    @Override    public Connection getConnection() throws SQLException {        if (list.size() <= 0) {            for (int i = 1; i < 3; i++) {                Connection connection = jdbcUtils.getConnection();                list.add(connection);            }        }        Connection connection = list.remove(0);        MyConnection myConnection = new MyConnection(connection, list);        return myConnection;    }

【常见的开源的数据库连接池】
DBCP:
C3P0:
【JDBC元数据MataData】

DatabaseMataData:获得数据库连接的数据,获得数据库表的数据
*获得数据库元数据:Connection中getMetaData数据。
ParameterMetaData:获得Sql中的参数的个数和类型。
*获得参数元数据:getparameterMetaData()。
resultSetMetaData:获得结果集中的列名及列的类型。
*获得结果集元数据:getMetaData().
->

public class MetaDataDemo01 {/* * 数据库元数据 * */       @Test    public void demo01(){        Connection connection = null;        connection = jdbcUtils.getConnection();        try {            DatabaseMetaData metaData = (DatabaseMetaData) connection.getMetaData();            System.out.println("获得驱动名称:"+metaData.getDriverName());            System.out.println("获得驱动的URL:"+metaData.getURL());            System.out.println("获得用户名:"+metaData.getUserName());            ResultSet resultSet = (ResultSet) metaData.getPrimaryKeys(null, null, "user");            if (resultSet.next()) {                String name = resultSet.getString("COLUMN_NAME");                System.out.println(name);            }        } catch (Exception e) {            // TODO: handle exception        }    }    @Test/* * 参数元数据 * */       public void demo02(){        Connection connection = null;        PreparedStatement preparedStatement = null;        try {            connection = jdbcUtils.getConnection();            String sql = "update user set cname = ? where cid = ?";            preparedStatement = (PreparedStatement) connection.prepareStatement(sql);            ParameterMetaData metaData = preparedStatement.getParameterMetaData();            int count = metaData.getParameterCount();            System.out.println(count);        } catch (Exception e) {            // TODO: handle exception        }    }    @Test/* * 结果集元数据 * */       public void demo03(){        Connection connection = null;        PreparedStatement preparedStatement = null;        ResultSet rsResultSet = null;        try {            connection = jdbcUtils.getConnection();            String sql = "select * from user";            preparedStatement = (PreparedStatement) connection.prepareStatement(sql);            rsResultSet = (ResultSet) preparedStatement.executeQuery();            ResultSetMetaData metaData = (ResultSetMetaData) rsResultSet.getMetaData();            int count = metaData.getColumnCount();            System.out.println(count);            for (int i = 0; i <= count; i++) {                String name = metaData.getColumnName(i);                String typeName = metaData.getColumnTypeName(i);                System.out.println(name +"\t" +typeName);            }        } catch (Exception e) {            // TODO: handle exception        }    }}

【更新DBUtils】

public class MyDbutils {    public static void update(String sql,Object... objects) {        Connection connection = null;        PreparedStatement preparedStatement = null;        try {            connection = jdbcUtils.getConnection();//          String Sql = "insert into user values (null,?)";            preparedStatement = (PreparedStatement) connection.prepareStatement(sql);//          preparedStatement.setString(1, "tommmyies");            ParameterMetaData metaData = preparedStatement.getParameterMetaData();            int count = metaData.getParameterCount();            for (int i = 1; i <= count; i++) {                preparedStatement.setObject(i, objects[i-1]);            }            preparedStatement.executeUpdate();        } catch (Exception e) {            // TODO: handle exception            e.printStackTrace();        }finally {            jdbcUtils.release(null, preparedStatement, connection);        }    }    public static void main(String[] args) {//      添加记录//      MyDbutils.update("insert into user(cid,cname) values(?,?)", "06","Tommyies");        MyDbutils.update("update user set cname = ? where cid = ?", "XXOOS","06");    }}
原创粉丝点击