连接池
概念:让connection得到服用,节省资源
原理:1.初始化一个连接池,定义connection对象的个数,每次使用直接从池子里面取出第一个,用完了就归还到最后面
2.池子里面的连接个数用完了,就等待设置的时间,如果有归还的连接,就直接使用,如果等待时间内没有归还的,那么就重新创建连接,使用完后直接销毁
装饰者模式
概述: 装饰者模式,是 23种常用的面向对象软件的设计模式之一. 动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。
作用:改写已存在的类的某个方法或某些方法,增强方法的逻辑
使用条件:1.增强类和被增强类实现的是同一个接口,2.增强类里面要拿到被增强类的引用
装饰者模式的使用(重点)
实现步骤:
- 增强类(WrapperCar)和被增强类(Qq)需要实现同一个接口(Car)
- 增强类(WrapperCar)里面需要得到被增强类(Qq)的引用, 例子里面把Qq车开到改装店 代码里面通过构造方法传进来的
- 对于不需要改写(stop)的方法,调用被增强类(Qq)原有的方法。
- 对于需要改写的方法(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 {
//释放资源
}