连接池优化操作

概述

使用jdbc的时候,每操作一次都需要获取连接,用完之后把连接释放掉了

为了管理数据库的连接,提高项目的性能。就在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可。所有的连接池必须实现一个接口 javax.sql.DataSource接口。获取连接的方法调用Connection getConnection(), 归还连接的方法就是以前的释放资源的方法,调用connection.close();

常用连接池:

      DBCP(没有自动回收空闲连接的功能):apache组织

                   使用步骤:

                           1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)

                           2.使用api

                                  a.硬编码       new BasicDataSource()v

                                  b.配置文件

      C3P0(有自动回收空闲连接功能):

                 hibernate和spring使用

                 有自动回收空闲连接的功能

                 使用步骤:

                         1.导入jar包(c3p0-0.9.1.2.jar)

                         2.使用api

                                 a.硬编码        new ComboPooledDataSource()

  ComboPooledDataSource ds=new ComboPooledDataSource();
        ds.setDriverClass("com.mysql.jdbc.Driver");
        ds.setJdbcUrl("jdbc:mysql://localhost:3306/day07");
        ds.setUser("root");
        ds.setPassword("123456");
        Connection coon=ds.getConnection();
        String sql="insert into categroy values(?,?)";
        PreparedStatement st=coon.prepareStatement(sql);
        st.setString(1,"c007");
        st.setString(2,"duyao");
        int i=st.executeUpdate();
        System.out.println(i);
        JdbcUntils_.closeResource(coon,st,null);

                                 b.配置文件

                                    配置文件的名称:c3p0.properties或者c3p0-config.xml

                                    配置文件的路径: src下

                                      编码只需要一句话:

                                      new ComboPooledDataSource()

                                      其余同上。

 

 

增强方法:

1.继承

2.修饰这模式(静态代理)

3.动态代理

package com.wzh.datasource;

import com.wzh.untils.JdbcUntils_;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;

//简易的连接池
public class MyDataSource {
    static LinkedList<Connection> pool=new LinkedList<>();
    static {
        //初始化的时候需要放入3个连接
        for (int i=0;i<3;i++){
            try {
                Connection conn= JdbcUntils_.getConnection();
                pool.addLast(conn);
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
    }
    //从连接池中获取连接
    public static Connection getConnection(){
        //获取连接的时候,需要判断List是否为空
        if(pool.isEmpty()){
            //添加2个连接进去
            for (int i=0;i<3;i++){
                try {
                    Connection conn= JdbcUntils_.getConnection();
                    pool.addLast(conn);
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
        }
        System.out.println("从池中获取一个链接");
        return pool.removeFirst();
    }
    //归还连接的方法
    public static void addBack(Connection conn){
        //将conn放入到list的最后面即可
        pool.addLast(conn);
        System.out.println("连接已归还");
    }
}

 

package com.wzh.datasource;

import java.sql.Connection;

public class TestDs {
    public static void main(String[] args){
        //创建连接
        MyDataSource ds=new MyDataSource();
        Connection conn=ds.getConnection();
        System.out.println(conn);
        //归还连接
        ds.addBack(conn);
    }
}

装饰者模式

https://mp.csdn.net/postedit/102727621

使用步骤:

1.装饰者和被装饰者实现同一个接口或者同一个类

2.装饰者中要有被装饰者的引用

3.对需要的增强方法进行加强

4.对不需要加强的方法

 

使用dbutils完成curd操作

dubutils是apache公司的一个工具类,jdbc的框架,更方便我们使用

使用步骤:

                1.倒入jar包(commons-dbutils-1.4.jar)

                2.创建一个queryrunner类

                        queryrunner作用:操作sql语句

                             构造方法:

                                   new QueryRunner(Datasource ds);

                3.编写sql

                4.执行sql

                        query(..):执行r操作

                        update(...):执行cud操作

连接池的工具类

package com.wzh.untils;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DataSourceUtils {
    private static ComboPooledDataSource ds=new ComboPooledDataSource();
    //获取数据源
    public static DataSource getDataSource(){
        ComboPooledDataSource ds = DataSourceUtils.ds;
        return ds;
    }

    //获取连接
    public static Connection getConnection()throws SQLException{
        return ds.getConnection();
    }
    //释放资源
    public static void closeResource(Connection conn, Statement st, ResultSet rs) {
        closeResultSet(rs);   //连接
        closeStatement(st);   //语句执行者
        closeConn(conn);      //结果集
    }

    //释放连接
    public static void closeConn(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }

    //释放预计执行者
    public static void closeStatement(Statement st) {
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            st = null;
        }
    }

    //释放结果集
    public static void closeResultSet(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
    }
}

使用连接池进行跟新数据


public class curd {
    @Test
    public void insert()throws SQLException {
        //1.创建queryrunner类
        QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
        //2.编写sql
        String sql="insert into categroy values(?,?)";
        //3.执行sql
        qr.update(sql,"c201","chufangdianqi");
    }
}

核心类或接口

    QueryRunner:类名

     作用:操作sql语句

     构造器:

            new QueryRunner(Datasource ds);

     注意:

            底层帮我们创建连接,创建语句执行者,释放资源

      常用方法:

             query(..);

 QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
        String sql="select * from categroy";
        Object[] query=qr.query(sql,new ArrayHandler());
        System.out.println(Arrays.toString(query));

             update(..);

       DdUtils:释放资源,控制事务

closeQuietly(conn);//内部处理异常
commitAndClose(Connection conn);//提交事务并释放连接

       ResultSetHandler:封装结果集 接口(查询的时候用到)

        9个实现类:

  • ArrayHandler:将查询结果的第一条封装成数组,返回
 QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
        String sql="select * from categroy";
        Object[] query=qr.query(sql,new ArrayHandler());
        System.out.println(Arrays.toString(query));
  • ArrayListHandler:将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
        String sql="select * from categroy";
        List<Object[]> list=qr.query(sql,new ArrayListHandler());
            for (Object[] objects:list){
                System.out.println(Arrays.toString(objects));
            }
  • BeanHandler:将查询结果的第一条记录封装成指定的bean对象,返回
  • BeanListHandler:将查询结果的第一条记录封装成指定的bean对象,将每一个bean对象放入list集合中,返回
  • ColumnListHandler:将查询结果的指定一列放入list中返回
  • MapHandler:将查询结果的第一条记录封装成map,字段名那个作为key,值为value,返回
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
        String sql="select * from categroy";
        Map<String,Object>map =qr.query(sql,new MapHandler());
            System.out.println(map);
  • MapListHandler:将查询结果的第一条记录封装成指定的map对象,将每一个map对象放入list集合中,返回
 QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
        String sql="select * from categroy";
        List<Map<String,Object>>list =qr.query(sql,new MapListHandler());
        for (Map<String,Object>map : list){
            System.out.println(map);
        }
  • ScalarHandler:针对于聚合函数 例如:count(),返回值是一个Long值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值