数据库连接池和装饰者模式

一:数据库连接池

概念:

用池来管理Connection,这可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是t通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection"归还"给池,池就可以再利用这个Connection对象了。
连接池也是使用四大连接参数来创建连接对象。

实现的接口:
连接池必须实现:javax.sql.DataSourse接口!
连接池返回的Connection对象,她的close()方法与众不同!调用它的close()不是关闭,zhuangshi
用连接池获得连接对象:

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbcp2.BasicDataSource;

public class Demo1 {
	public static void main(String[] args) {
		/**
		 * 创建连接池
		 * 1.创建连接池对象
		 * 2.配置四大参数
		 * 3.配置池参数
		 * 4.得到连接对象
		 */
		
		try {
			BasicDataSource dataSource=new BasicDataSource();
			dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
			dataSource.setUrl("jdbc:mysql://localhost:3306/mydb1?serverTimezone=GMT%2B8");
			dataSource.setUsername("root");
			dataSource.setMaxTotal(20);
			dataSource.setMinIdle(3);
			dataSource.setMaxWaitMillis(1000);
			Connection con = null;
			con = dataSource.getConnection();
			
			System.out.println(con);
			con.close();//把连接归还给池
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		/**
		 * 连接池内部使用四大参数创建了连接对象!即mysql驱动提供的Connection
		 * 连接池使用mysql的连接对象进行了装饰,只对close()方法进行了增强!
		 * 装饰之后的Connection的close()方法,用来把当前连接归还给池!
		 */
		
	}

}

连接池模式:
在这里插入图片描述
dbcp底层还是用mysql连接,只是进行了包装,其他的方法都是mysql的方法,只有close()方法用的是自己的。

二:装饰者模式

增强对象的三种方法:
1.继承:被增强的对象是固定的,增强的内容也是固定的
class 咖啡{}
class 加糖咖啡 extends 咖啡{}
class 加奶咖啡 extends 咖啡{}
class 加糖加奶咖啡 extends?
*
*
*
缺点:类的对象会暴增!不好实现
加强对象是死的,加强结果也是死的
2.装饰者:被增强的内容可以切换,增强的内容是固定的
咖啡 a=new 咖啡();
加糖咖啡 b=new(a);
加糖加奶咖啡 c=new (b);
特点:
1.增强的内容是不能修改的!
2.被增强的对象可以是任意的!
实现:
在这里插入图片描述
3.动态代理:被增强的对象可以切换,增强的内容也可以切换
装饰者模式例子:
1.关闭数据库时用我自己创建的Connection对象可以关闭数据库,并且打印一行hh;打印一行时附加功能

import java.sql.Connection;
import java.sql.SQLException;

public class MyConnection extends MyConnectionWrapper{

	public MyConnection(Connection e) {
		super(e);
		// TODO Auto-generated constructor stub
	}
	public void close() {
		System.out.println("hh");
		try {
			super.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

2.用我自己创建的文件输入流来读取文件,每读取一个字节之后减去key,从而实现文件加密。

class MyInputStream extends InputStream{
    private InputStream in;
    private int key;
    public MyInputStream(InputStream in,int key) {
    	this.in=in;
    	this.key=key;
    }
	@Override
	public int read() throws IOException {
		// TODO Auto-generated method stub
		return this.in.read()-key;
	}
	
}

三:c3p0连接池的连接

代码连接:

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * c3p0连接池的实现
 * @author lenovo
 *
 */
public class C3p0 {
	public static void main(String[] args) {
		
		try {
			//1.创建连接池对象
			ComboPooledDataSource dataSource=new ComboPooledDataSource();
			//2.对池进行四大参数配置
			dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
			dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1?serverTimezone=GMT%2B8");
			dataSource.setUser("root");
			dataSource.setPassword("cl091900");
			//3.池配置
			dataSource.setAcquireIncrement(20);
			dataSource.setInitialPoolSize(5);
			dataSource.setMinPoolSize(2);
			dataSource.setMaxPoolSize(10);
			Connection con=dataSource.getConnection();
			System.out.println(con);
			//4.关闭
			con.close();
		} catch (PropertyVetoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

xml默认文件配置
要求:
1.文件名必须为c3p0-config.xml
2.文件目录必须在src下
由于参数都差不多,这里就不给了。如果想要的话可以私信我哟

原创文章 114 获赞 84 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44867340/article/details/105634200
今日推荐