Druid连接池

DRUID连接池
阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个 SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。简单SQL语句用时10微秒以内,复杂SQL用时30微秒。通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。
配置文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school
username=root
password=root
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=5000

导入jar包
在这里插入图片描述

private static DruidDataSource dataSource;
static{
    try {
        Properties properties=new Properties();
        InputStream is = DbUtils_Druid.class.getClassLoader().getResourceAsStream("druid.properties");
        properties.load(is);
        dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);

    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("初始化连接池失败");
    }
}

public static Connection getConnection(){

    try {
        return dataSource.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}


public static void closeAll(Connection conn, Statement stat, ResultSet rs){
    try {
        if(rs!=null){
            rs.close();
        }
        if(stat!=null){
            stat.close();
        }
        if(conn!=null){
            conn.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public static int executeUpdate(String sql,Object...params){ //insert update delete  ?????

    Connection conn =null;
    PreparedStatement pstat=null;
    try {
        conn = getConnection();
        pstat = conn.prepareStatement(sql);
        //设置参数
        if(params!=null){
            for (int i = 0; i < params.length; i++) {
                pstat.setObject(i+1, params[i]);
            }
        }
        return pstat.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        closeAll(conn, pstat, null);
    }
    return -1;

}

//返回List集合的方法
public  static <T> List<T> findList(String sql,  Class<T> class1,Object... params){
    List<T> list=new ArrayList<>();
    Connection conn=null;
    PreparedStatement pstat=null;
    ResultSet rs=null;
    //查询数据
    try {
        conn=getConnection();
        pstat = conn.prepareStatement(sql);
        if(params!=null){
            for (int i = 0; i < params.length; i++) {
                pstat.setObject(i+1, params[i]);
            }
        }
        rs = pstat.executeQuery();
        //获取rs中的列名
        ResultSetMetaData metaData = rs.getMetaData();
        while(rs.next()){
            //创建一个对象
            T t=convertToObject(metaData, rs, class1);
            list.add(t);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        closeAll(conn, pstat, rs);
    }

    return list;
}



//返回单个对象的方法
public static <T> T findSingle(String sql,Class<T> class1,Object...params ){

    Connection conn=null;
    PreparedStatement pstat=null;
    ResultSet rs=null;
    //查询数据
    try {
        conn=getConnection();
        pstat = conn.prepareStatement(sql);
        if(params!=null){
            for (int i = 0; i < params.length; i++) {
                pstat.setObject(i+1, params[i]);
            }
        }
        rs = pstat.executeQuery();
        //获取rs中的列名
        ResultSetMetaData metaData = rs.getMetaData();
        if(rs.next()){
            //创建一个对象
            return convertToObject(metaData, rs, class1);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        closeAll(conn, pstat, rs);
    }
    return null;
}

public static <T> T convertToObject(ResultSetMetaData metaData,ResultSet rs,Class<T> class1){
    try {
        T t=class1.newInstance();
        for(int i=0;i<metaData.getColumnCount();i++){
            String columnLabel=metaData.getColumnLabel(i+1);
            Object value = rs.getObject(columnLabel);//empno  ename job
            //System.out.println(columnLabel+"==="+value);
            //创建属性描述符
            try {
                PropertyDescriptor pd=new PropertyDescriptor(columnLabel, class1);
                if(pd!=null){
                    //System.out.println(pd.getName());
                    Method writeMethod = pd.getWriteMethod(); //setEmpno setEname setJob
                    writeMethod.invoke(t,value);
                }
            } catch (Exception e) {
                continue;
            }
        }
        return t;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

测试类

public  void testD(){
       for (int i = 0; i <100; i++) {
           Connection connection = DbUtils_Druid.getConnection();
           System.out.println(connection.hashCode());
       }
   }
}

没有关闭

 @Test
    public void testDruid(){
        for(int i=0;i<100;i++){
            Connection conn = DbUtils_Druid.getConnection();
            System.out.println(i+"获取了:"+conn.hashCode());
            try {
                conn.close();//close()没有关闭,把连接放入池中
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值