JAVAWEB学习总结,DAY5(JDBC2)

连接池
概念:让connection得到服用,节省资源
原理:1.初始化一个连接池,定义connection对象的个数,每次使用直接从池子里面取出第一个,用完了就归还到最后面
2.池子里面的连接个数用完了,就等待设置的时间,如果有归还的连接,就直接使用,如果等待时间内没有归还的,那么就重新创建连接,使用完后直接销毁

装饰者模式
概述: 装饰者模式,是 23种常用的面向对象软件的设计模式之一. 动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。
作用:改写已存在的类的某个方法或某些方法,增强方法的逻辑
使用条件:1.增强类和被增强类实现的是同一个接口,2.增强类里面要拿到被增强类的引用

装饰者模式的使用(重点

实现步骤:

  1. 增强类(WrapperCar)和被增强类(Qq)需要实现同一个接口(Car)
  2. 增强类(WrapperCar)里面需要得到被增强类(Qq)的引用, 例子里面把Qq车开到改装店 代码里面通过构造方法传进来的
  3. 对于不需要改写(stop)的方法,调用被增强类(Qq)原有的方法。
  4. 对于需要改写的方法(run),写自己的代码

张三追妹子, 要买车.
张三钱不够, 就买了一辆Qq车. Qq车可以跑60迈, Qq车可以刹车.
开了一段时间,发现追不到妹子. 因为车跑的太慢,但是又没钱买跑车.
所以把Qq车开到改装店进行改装, 改速度跑100迈, 刹车不改.

/**
 * 车的规范
 */
public interface Car {
    void run();
    void stop();
}
/**
 * QQ厂商(被增强的类)
 */
public class Qq implements Car {
    @Override
    public void run() {
        System.out.println("Qq可以跑60迈...");
    }
    @Override
    public void stop() {
        System.out.println("Qq刹车...");

    }
}

/**
 * 改装店(增强的类)
 */
public class WrapperCar implements  Car{
    //需要把Qq车开进来(增强类(WrapperCar)里面需要得到被增强类(Qq)的引用)
   private Car car;
    public WrapperCar(Car car) {
        this.car = car;
    }
    @Override
    //需要增强(写自己的逻辑)
    public void run() {
        System.out.println("5s破百..");
    }
    @Override
    //不需要增强(调用之前的逻辑)
    public void stop() {
        car.stop();
    }
}

第三方连接池
常用连接池:
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0是异步操作的,所以一些操作时间过长的JDBC通过其它的辅助线程完成。目前使用它的开源项目有Hibernate,Spring等。C3P0有自动回收空闲连接功能

阿里巴巴-德鲁伊druid连接池:Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求。

DBCP(DataBase Connection Pool)数据库连接池,是Apache上的一个Java连接池项目,也是Tomcat使用的连接池组件。dbcp没有自动回收空闲连接的功能。

c3p0的使用
通过硬编码来编写【了解】
步骤
1.导入c3p0的jar包
2.创建C3P0连接池
3.从C3P0连接池获得连接

通过配置文件来编写【重点】
步骤:
1.导入c3p0的jar包
2.拷贝c3p0-config.xml到src目录下(配置文件的名字不要改)
3.直接创建C3P0连接池(自动读取配置文件的)

使用c3p0改写工具类【重点】

/**
 * 目的:
 * 1. 保证DataSource只有一个
 * 2. 提供连接(DataSource获得)
 * 3. 释放资源
 */
public class C3P0Utils {

    //创建C3P0数据源(连接池)
    private static DataSource dataSource = new ComboPooledDataSource();

    /**
     * 从dataSource(连接池)获得连接对象
     *
     * @return
     * @throws Exception
     */
    public static Connection getConnection() throws Exception {
        Connection connection = dataSource.getConnection();
        return  connection;
    }

    /**
     * 释放资源
     *
     * @param resultSet
     * @param statement
     * @param connection
     */
    public static void release(ResultSet resultSet, Statement statement, Connection connection) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();//看Connection来自哪里, 如果Connection是从连接池里面获得的, close()方法其实是归还; 如果Connection是创建的, 就是销毁
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

druid连接池

通过硬编码方式【了解】
步骤:
1.导入DRUID jar 包
2.创建Druid连接池对象
3.从Druid连接池获得Connection

通过配置文件方式【重点】
步骤:
1.导入DRUID jar 包
2.拷贝配置文件到src目录
3.根据配置文件 创建连接池对象
4.从连接池对象获得连接

//0 根据druid.properties创建配置文件对象
Properties properties = new Properties();
// 关联druid.properties文件
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(is);
//1. 创建DataSource
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

//2. 从数据源(连接池)获得连接对象
Connection connection = dataSource.getConnection();


JDBC事务的处理


try {
    //开启事务   connection.setAutoCommit(false);
    //....
    //提交事务     connection.commit();
} catch (Exception e) {
    //回滚事务     connection.rollback();
}finally {
    //释放资源
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值